whereDoesntHave not working with hasMany 关系如预期

时间:2021-06-01 08:23:25

标签: php mysql laravel eloquent orm

每个目标都有许多证书。

certs
target_id uploaded
1         1
1         0

我想获取没有任何已上传证书 (uploaded = 0) 的目标。下面的查询仍然返回目标 1,但它应该什么都不返回!

Target::whereDoesntHave('certs', function ($query) { 
    $query->where('uploaded', 0);
})->get();

而laravel产生的查询是:

SELECT * FROM `targets`
WHERE NOT EXISTS (
    SELECT * FROM `certs`
    WHERE `targets`.`id` = `certs`.`target_id` AND `uploaded` = 0
)

2 个答案:

答案 0 :(得分:0)

你可以试试 doesntHave

  Target::doesntHave('certs','and', function ($query) { $query->where('uploaded', 0); })->get()

更新

 Target::with(['certs'])->whereHas('certs', function ($query) { $query->where('uploaded', 0); })->get()

答案 1 :(得分:0)

您当前的查询正在获取所有没有任何未上传证书的目标,即没有上传为 0 的证书。

您应该能够通过将 0 更改为 1 来获取您想要的内容,即获取没有任何已上传证书的所有目标:

Target::whereDoesntHave('certs', function ($query) {
    $query->where('uploaded', 1);
})->get();