Bạn cũng có thể viết lại truy vấn của mình dưới dạng kết hợp bên trái như
SELECT i.*
FROM item i
LEFT JOIN qualifications q ON q.item_id = i.id AND q.user_id = 2
WHERE q.item_id IS NULL
Trong trình tạo truy vấn, bạn có thể viết nó là
DB::table('item as i')
->select('i.*')
->leftJoin('qualifications as q', function ($join) use($user_id) {
$join->on('q.item_id', '=', 'i.id')
->on('q.user_id', '=', $user_id);
})
->whereNull('q.item_id')
->get();
Một cách tiếp cận khác mà tôi khuyên bạn nên thực hiện, là thiết lập các mối quan hệ và mô hình của bạn và thực hiện nó một cách hùng hồn
class Item extends Model
{
public function qualifications()
{
return $this->hasMany(\App\Models\Qualification::class, 'item_id');
}
}
class Qualification extends Model
{
public function qualifications()
{
return $this->belongsTo(Item::class, 'item_id');
}
}
Và sau đó, bạn có thể sử dụng Truy vấn vắng mặt mối quan hệ
Item::whereDoesntHave('qualifications', function ($query) use($user_id) {
$query->where('user_id', '=', $user_id);
})->get();