查询方法转换成SQL 对比示例

子查询 Where 语句

  1. DB::table('users')->where(function ($query) {
  2. $query->select('type')
  3. ->from('membership')
  4. ->whereColumn('user_id', 'users.id')
  5. ->orderByDesc('start_date')
  6. ->limit(1);
  7. }, '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();

只有在事务中才会生效,数据所在行被锁定,此刻其他事务中的锁表操作会等待当前事务提交才会执行,但是对于非锁表和普通的查询操作并没有限制,有影响的只是你在事务中同样执行的锁表操作。

无论是共享锁还是悲观锁,受影响的只是事务中执行锁表的操作,对于普通的查询操作,和事务中的非锁表操作没有影响