記錄一下使用左關聯的一次查詢(可樂的筆記)

我愛大可樂發表於2021-01-03

記錄一下使用左關聯的一次查詢

情景描述:

有兩個表,一個為users表,一個為庫存表:user_storage。兩者是一(users)對多(user_Storage)。查出users中等級為3的使用者,對應的庫存總量並從大到小排序,沒有預設為0

那面對這種情況,我的想法就是分組求和:
我第一次寫的是:

User::leftJoin('user_storage','users.id','user_storage.user_id')
    ->where('users.level',3)
    ->select('users.id','users.mobile',DB::raw("ifnull(sum(user_storage.num) ,0) as total"))
    ->orderByDesc('total')->take(10)->skip(0)->get();

第一次寫的是可以正常查出來的:在user_storage表中不存在的使用者用0表示出來了。
但是當我加上條件後:

->where('user_storage.storage_type',0)

加上一句條件後發現user_storage表中不存在使用者沒有查出來。查了一下文件,發現使用下面的方式是可以查詢出來的。(ps:順便查了下,說使用Eloquent ORM的模型關聯也可以實現,不過沒有找到具體的實現方法,如君願教,感激不盡。)

User::leftJoin('user_storage',function($q){
    $q->on('users.id','user_storage.user_id')
      ->where('user_storage.storage_type',0);
})
->where('users.level',3)
->select('users.id','users.mobile',DB::raw("ifnull(sum(user_storage.num) ,0) as total"))
->orderByDesc('total')->take(10)->skip(0)->get();

(當使用左關聯時,外部的條件會限制查詢範圍,使其效果如同Join一樣,使用函式閉包的形式,可以限制作用範圍)

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我愛大可樂

相關文章