find()
使用主键查询一条数据User::select('id', 'name')->find($id);
first()
选取第一条数据User::where('id', $id)->first();
User::select('id','name')->where('id', $id)->first();
User::where('id', $id)->first(['id', 'name']); #选字段、少些代码是好习惯
注:laravel把
first()
和find()
转成下边的SQL,并自动加上 limit 1提高效率
SELECT id,name FROM users WHERE id = 67373 LIMIT 1
这两个方法获取得到的是一个 对象 或者 null。
value()
获取一条的某一个字段User::where('id',$id)->value('name');
注:实际上是生成
SELECT name FROM users WHERE id = 67373 LIMIT 1
查询后判断有没有这条数据,有则返回name字段,没有返回null。
get()
User::where('id','<',100)->get(['id','name']);
注:此方法得到的是一个collection集合,可以直接当做数组获取键名键值等,但是不能直接使用PHP数组的操作方法,需要
User::where('id','<',100)->get(['id','name'])->toArray();
转成数组。
pluck()
User::where('id','<',10)->pluck('id'); //得到索引数组
User::where('id','<',10)->pluck('name','id');//得到id=>name的关联数组
User::where('id',$id)->first();
User::where('id','!=',$id)->first()
User::whereIn('id',[110,119,120])->get(['name']);
User::whereNotIn('id',[110,119,120])->get(['name']);
User::orderBy('created_at')->get(['id','name']);
User::orderBy('created_at','desc')->get(['id','name']);
User::orderByDesc('created_at')->get(['id','name']);
订单od_id,用户u_id,类型od_type
。// User模型里:与Order模型一对多关系关联方法。
class User extends Model{
//属性设置...
public function orders(){
return $this->hasMany(Order::class,'u_id','id');
}
}
1.查询所有用户及关联订单。
User::with('orders:u_id,od_id')->get(['id','name']);
#“方法名:字段1,字段2...”的形式,注意的是选取的字段里必须包含与user关联的字段,即u_id
2.查询所有用户及关联订单中类型为3的。
$type = 3;
User::with(['orders'=>function($query) use($type) {
$query->select('u_id','od_id','od_type')->where('od_type',$type);
}])
->get(['id','name']);
#也可以是数组闭包形式再次筛选,参数使用use传递。
3.查询有订单的用户及关联订单
订单影响用户,排除关联不到订单的用户。
本例中,2或者3都是whereHas不加条件,和has没有什么区别。
1. User::with('orders:od_id,u_id')->has('orders')->get(['id','name']);
2. User::with('orders:od_id,u_id')->whereHas('orders')->get(['id','name']);
3. User::with('orders:od_id,u_id')
->whereHas('orders',function($query){
})
->get(['id','name']);
1.select `id`, `name` from `users` where exists
(select * from `orders` where `users`.`id` = `orders`.`u_id`)
2.select * from `orders` where `orders`.`u_id` in ('1', '2')
4.查询有订单的用户,筛选出订单类型为3的订单。
只要有订单用户就显示,但是订单只显示类型3的,没有是空集合(hasOne时为null)。
对关联进行筛选,不影响外层。
User::with(['orders' => function($query){
$query->select('od_id','u_id','od_type')->where('od_type',3);
}])
->has('orders')
->get(['id','name']);
1.select `id`, `name` from `users` where exists
(select * from `orders` where `users`.`id` = `orders`.`u_id`)
2.select * from `orders` where `orders`.`u_id` in ('1', '2') and `type` = '2'
5.查询有订单并且含有订单类型为3的用户。
当前用户订单里没有类型为3的,外层用户也不显示。
当前用户订单只要有类型为3的,非类型为3的订单也显示。
对关联进行含有判断(看样子不是筛选),影响外层。
User::with('orders:od_id,u_id,od_type')
->whereHas('orders',function($query){
$query->where('od_type',3);
})
->get(['id','name']);
1.select `id`, `name` from `users` where exists
(select * from `orders` where `users`.`id` = `orders`.`u_id` and `type` = '1')
2.select * from `orders` where `orders`.`u_id` in ('1')
每页10条,第3页
User::orderByDesc('created_at')->offset((3-1)*10)->limit(10)->get();