获取模型
get
,all
都可以获取到模型 all
是直接获取所有,get
是在添加了许多约束之后获取模型,get
前面如果不加约束条件的话,效果与all
等同
App\User::all();
App\User::get();
App\User::where('id','>',5)->get();
结果集
$users = User::get();
get 方法返回包含结果集的 Illuminate\Support\Collection,其中每一个结果都是 PHP 的 StdClass 对象实例:
你可以像访问对象的属性一样访问字段的值:
foreach ($users as $user) {
echo $user->name;
}
获取一行或者一列数据
- 如果我们只想获取到一行数据,可以使用
first
方法
$user = User::where('name','marun')->first();
- 获取一列,可以使用
value
方法,该方法直接返回符合条件的第一列的数据
$user = User::where('name','marun')->value('password');
pluck
获取符合条件的所有列的数据
$user = User::where('name','marun')->pluck('password');
- 还可以在返回数组中为列值指定自定义键(该自定义键必须是该表的其它字段列名,否则会报错)这个也只会查第一条数据啊…:
$user = User::pluck('password','name');
块级结果集
如果你需要处理成千上百条数据库记录,可以考虑使用 chunk 方法,该方法一次获取结果集的一小块,然后传递每一小块数据到闭包函数进行处理,该方法在编写处理大量数据库记录的 Artisan 命令的时候非常有用。例如,我们可以将处理全部 users 表数据分割成一次处理 100 条记录的小组块:
User::orderBy('id')->chunk(2,function ($users){
dump($users);
});
你可以通过从闭包函数中返回 false 来终止组块的运行:
User::orderBy('id')->chunk(2,function ($users){
if($users[0]->name == 'Marun'){
dump($users[0]);
return false;
}
});
聚合函数
查询构建器还提供了多个聚合方法,如count
, max
, min
, avg
和 sum
,你可以在构造查询之后调用这些方法:
$count = User::get()->count();
$count = User::get()->max('id');
$count = User::get()->min('id');
$count = User::get()->avg('id');
$count = User::get()->sum('id');
聚合函数前面也可以增加约束条件
查询(Select)
select
方法,返回指定的字段
$users = User::select('name','password')->get()->toArray();
distinct
方法,强制返回不重复的数据集合
$users = User::select('name')->distinct()->get()->toArray();
如果你已经有了一个查询构建器实例并且希望添加一个查询列到已存在的 select 子句,可以使用 addSelect
方法:
$query = User::select('name');
$users = $query->addSelect('password')->get();
原生表达式
使用DB::raw
但要注意SQL注入
$users = User::select(DB::raw('count(*) as user_count , name '))
->where('id', '<>', 1)
->groupBy('name')
->get();
dump($users);
原生方法
selectRaw
selectRaw
等同于 select(DB::raw(....))
,该方法接收一个可选的绑定数组来作为第二个参数
$users = User::selectRaw('name')
->get();
whereRaw / orWhereRaw
whereRaw 和 orWhereRaw
方法可用于注入原生 where 子句到查询,这两个方法接收一个可选的绑定数组作为第二个参数:
$users = User::whereRaw('price > IF( name= "marun", 100, ?)', [50])
->get()->toArray();
havingRaw / orHavingRaw
havingRaw 和 orHavingRaw
方法可用于设置原生字符串作为 having 子句的值:
这里我报错了 , SQLSTATE[42000]: Syntax error or access violation: 1055
解决办法 :
在Laravel的config\database.php中 mysql的一个设置 把strict 默认值改成 false
$orders = User::groupBy('name')
->havingRaw('price > 300')
->get();
orderByRaw
orderByRaw
方法可用于设置原生字符串作为 order by
子句的值:
$orders = User::orderByRaw('updated_at - created_at DESC')
->get();