查询方法转换成SQL 对比示例
子查询 Where 语句
DB::table('users')->where(function ($query) {
$query->select('type')
->from('membership')
->whereColumn('user_id', 'users.id')
->orderByDesc('start_date')
->limit(1);
}, 'Pro')->dd();
SQL: select * from
userswhere (select
typefrom
membershipwhere
user_id=
users.
idorder by
start_datedesc limit 1) = ?
高级 Join 语句
DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->dd();
SQL: select * from
usersinner join
contactson
users.
id=
contacts.
user_idand
contacts.
user_id> ?
高级 Join 语句 子连接查询
joinSub
leftJoinSub
rightJoinSub
接收三个参数:子查询,表别名和定义关联字段的闭包
$latestPosts = DB::table('posts')
->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
->where('is_published', true)
->groupBy('user_id');
DB::table('users')
->joinSub($latestPosts, 'latest_posts', function ($join) {
$join->on('users.id', '=', 'latest_posts.user_id');
})->dd();
SQL: select * from
usersinner join (select
user_id, MAX(created_at) as last_post_created_at from
postswhere
is_published= ? group by
user_id) as
latest_postson
users.
id=
latest_posts.
user_id``
乐观锁(共享锁)
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
在事务中使用时才会生效,会把数据所在行进行锁定,此时被锁定的数据,不允许被其他操作修改,但是被锁定的数据,对查询操作没有影响,无论是普通查询还是事务中的查询操作,都不会受到影响。
悲观锁
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
只有在事务中才会生效,数据所在行被锁定,此刻其他事务中的锁表操作会等待当前事务提交才会执行,但是对于非锁表和普通的查询操作并没有限制,有影响的只是你在事务中同样执行的锁表操作。
无论是共享锁还是悲观锁,受影响的只是事务中执行锁表的操作,对于普通的查询操作,和事务中的非锁表操作没有影响