链式调用就是用使用不同的方法分别指定SQL语句的各个部分, 最后根据指定的数据拼装成SQL语句并执行.
使用 DB::table(表名)
来指定查询的数据表名.
使用 DB::select(字段名数组)
来指定查询的字段, 缺省值为 *
.
使用 DB::where(字段名, 操作符[缺省: = ], 字段值)
来指定where条件.
使用 DB::orderBy(字段名, 排序方式)
来指定排序字段名和排序方式.
使用 DB::groupBy(分组字段名数组)
来指定分组字段名.
查询的结果中, 一条记录就是一个对象, 多条记录就是对象数组.
DB::first()
来查询单条记录.
/* 高级数据库查询方法[链式调用, 已做防注入] */
/* 查询单条记录 */
public function finds()
{
$res = DB::table('player')->first();
printf('<pre>%s</pre>', print_r($query, true));
print_r($query);
}
DB::get()->all()
来查询多条记录.
/* 查询多条记录 */
public function list()
{
// get()方法返回的是Collection类型的数据,
/* 再调用all()方法就可以返回Collection中的纯数据了 */
$data = DB::table('player')->select('*')->where('id', '<', 6)->get()->all();
print('<pre>');
print_r($data);
}
使用 DB::where(字段名, 'like', 字段值)
来指定like模糊查询条件.
少用like模糊查询, 或尽量使用 like 'xxx%'
方式的模糊查询.
/* like模糊查询 */
public function likes()
{
/* like会造成全表扫描, 性能较差, 若一定要用, 则最好是like 'xxx%'的形式, 即, 以准确的数据开始, 后面是%的 */
$collection = DB::table('player')->select('name', 'position')->where('name', 'like', '拉%')->get();
print_r($collection->all());
}
方法1: 使用重复链式调用 DB::where()
方法的方式来指定多个查询条件.
方法2: 把多个查询条件组成二维数组, 传入 DB::where()
方法中
/* 多条件查询 */
public function wheres1()
{
// 重复调用where()方法
$collection = DB::table('player')->select('name', 'position')->where('team', '湖人')->where('position', 'G')->get();
print_r($collection->all());
}
public function wheres2()
{
// 查询条件缺省条件为"等于", 若是非等于条件, 则第二个数组成员为操作符.
$wheres = [
['team', '湖人'],
['position', '<>' , 'G']
];
// 传入查询条件数组
$collection = DB::table('player')->select('name', 'position')->where($wheres)->get();
print_r($collection->all());
}
DB::orWhere()
来指定or查询条件
/* or查询 */
public function ors()
{
// 用orWhere()关联, 注意, 第一个必须是普通的where()
$collection = DB::table('player')->select('name', 'position')->where('position', 'G')->orWhere('position', 'G-F')->get();
print_r($collection->all());
}
使用 DB::whereIn()
来指定in查询条件
in查询的效率比其他非等于查询的效率要高, 在非等于查询中, 优先考虑用in查询
/* in查询 */
public function whereIn()
{
// 用whereIn()实现in操作
$collection = DB::table('player')->select('name', 'position')->whereIn('id', [1, 2, 5])->get();
print_r($collection->all());
}
使用 DB::tosql()
方法查看拼接成的查询SQL语句
好像不能查看insert, update和delete语句.
public function tosql()
{
// 用tosql()
$sql = DB::table('player')->select('name', 'position')->where('position', 'G')->orWhere('position', 'G-F')->tosql();
print_r($sql);
}
// 单数据库
DB::connection()->enableQueryLog(); // 开启QueryLog
$res = DB::table('admin')->where('id', $id)->update($admin);
dump(DB::getQueryLog()); // 打印SQL执行情况
// 多数据库中非默认数据库
// 其中connection()指定在/config/database.php中定义的数据源名称('connections'配置项中的key值.)
DB::connection('sqlsrv')->enableQueryLog(); // 开启QueryLog
$res = DB::connection('sqlsrv')->table('admin')->where('id', $id)->update($admin);
dump(DB::connection('sqlsrv')->getQueryLog()); // 打印SQL执行情况
使用 DB::join()
方法来指定关联的表和关联条件
使用 DB::avg()
方法来指定某个字段的平均值. 其他统计查询应该也是同名函数.
/* 关联查询 */
public function join()
{
$data = DB::table('player')->join('salary', 'player.id', '=', 'salary.player_id')->select('team')->groupBy('team')->avg('salary');
print_r($data);
}
DB::insert()
方法来执行插入一条记录, 参数为一维数组, 表示要插入的一条记录.
/* 插入1条记录 */
public function create()
{
$res = DB::table('salary')->insert(['player_id' => 3, 'salary_year' => '2019-2020', 'salary' => '8000000']);
print_r($res);
}
DB::insertGetId()
方法来执行操作, 并返回插入成功后生成的记录id
/* 插入记录, 并返回插入记录的id */
public function insertGetId()
{
$salary1 = ['player_id' => 5, 'salary_year' => '2019-2020', 'salary' => '5000000'];
$id = DB::table('salary')->insertGetId($salary1);
print_r($id);
}
DB::insert()
方法来执行插入一条记录, 参数为二维数组, 表示要插入的多条记录.
/* 插入多条记录 */
public function batchInsert()
{
$salary1 = ['player_id' => 3, 'salary_year' => '2019-2020', 'salary' => '8000000'];
$salary2 = ['player_id' => 4, 'salary_year' => '2019-2020', 'salary' => '10000000'];
$salarys = [];
$salarys[] = $salary1;
$salarys[] = $salary2;
$res = DB::table('salary')->insert($salarys);
print_r($res);
}
DB::update()
方法来执行数据更新操作, 传入的参数为要更新的字段名和更新后的新值组成的数组.
public function update1()
{
$updates = ['salary' => 3200000];
$res = DB::table('salary')->where('player_id', 6)->update($updates);
print_r($res);
}
DB::delete()
方法来执行数据删除操作.
public function delete1()
{
print_r(DB::table('salary')->where('player_id', 6)->delete());
}
在laravel中, 模型的概念是被弱化的.
使用模型类, 相当于 DB::table(tblName)
语句, 后可使用laravel链式操作数据库的所有操作方法. 但其查询返回值是一个模型对象数组, 每条记录是数组中对象的一个属性.
可以使用artisan命令创建模型文件, 在laravel项目的根目录: php artisan make:model 模型名称
;
命令创建模型的路径是: /app/
;
laravel建议把模型名称命名为其对应的数据库表名, 其中数据库表名为复数形式, 模型名称为单数形式. 假设数据库表是 articles
, 则把对应的模型命名为: Article
. 若模型名称跟对应的数据库表名不一致, 则需要在模型中创建一个名为 $table
的 protected
属性, 其值为对应的数据表名.
模型操作示例:
1-模型类
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
// 指定表名(不指定的话, 默认表名是players, 模型名称+s, 烦人)
protected $table = 'article';
}
2-控制器@方法片段:
public function articles(Article $article) {
// 查询表中的所有数据
$models = $article->get()->all();
// 查询结果是一个对象
dump($models);
// 直接返回记录数组
$datas = $article->get()->toArray();
dump($datas);
}
在实际开发中, 链式调用操作数据库的方式是最常用的, 应该熟练掌握.
在web开发中, 尽量使用单表查询, 尽量使用”等于”操作; 若需要用 like
操作符, 则尽量是 xxx%
形式的值; MySQL中, in
的效率比其他非等于操作符的效率高.
在laravel中, 模型的概念是被弱化的. 因为部分程序员把它作为业务逻辑的实现层, 而另一部分程序员把它作为跟数据库交互的持久化层. 是否使用模型, 取决于个人使用习惯.