查询方法转换成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 * fromuserswhere (selecttypefrommembershipwhereuser_id=users.idorder bystart_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 * fromusersinner joincontactsonusers.id=contacts.user_idandcontacts.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 * fromusersinner join (selectuser_id, MAX(created_at) as last_post_created_at frompostswhereis_published= ? group byuser_id) aslatest_postsonusers.id=latest_posts.user_id``
乐观锁(共享锁)
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
在事务中使用时才会生效,会把数据所在行进行锁定,此时被锁定的数据,不允许被其他操作修改,但是被锁定的数据,对查询操作没有影响,无论是普通查询还是事务中的查询操作,都不会受到影响。
悲观锁
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
只有在事务中才会生效,数据所在行被锁定,此刻其他事务中的锁表操作会等待当前事务提交才会执行,但是对于非锁表和普通的查询操作并没有限制,有影响的只是你在事务中同样执行的锁表操作。
无论是共享锁还是悲观锁,受影响的只是事务中执行锁表的操作,对于普通的查询操作,和事务中的非锁表操作没有影响
