Laravel Eloquent ORM查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z772532526/article/details/82775977

一、获取单条

  1. find()使用主键查询一条数据
User::select('id', 'name')->find($id);
  1. 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

  1. value()获取一条的某一个字段
User::where('id',$id)->value('name');

注:实际上是生成SELECT name FROM users WHERE id = 67373 LIMIT 1查询后判断有没有这条数据,有则返回name字段,没有返回null。

二、获取多条

  1. get()
User::where('id','<',100)->get(['id','name']);

注:此方法得到的是一个collection集合,可以直接当做数组获取键名键值等,但是不能直接使用PHP数组的操作方法,需要
User::where('id','<',100)->get(['id','name'])->toArray();转成数组。

  1. pluck()
User::where('id','<',10)->pluck('id'); //得到索引数组
User::where('id','<',10)->pluck('name','id');//得到id=>name的关联数组

三、where用法

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']);

四、order by用法

User::orderBy('created_at')->get(['id','name']);
User::orderBy('created_at','desc')->get(['id','name']);
User::orderByDesc('created_at')->get(['id','name'])

五、with、has及whereHas

关联模型,参考
假设有一个订单表订单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')

六、offset和limit

每页10条,第3页

User::orderByDesc('created_at')->offset((3-1)*10)->limit(10)->get();

猜你喜欢

转载自blog.csdn.net/z772532526/article/details/82775977
今日推荐