Laravel 5.5 - whereIn 和 whereNotIn 在同一个 eloquent 查询中?

Laravel 5.5 - whereIn and whereNotIn in same eloquent query?

我有两个 table,我需要 pluck buildings 中存在的有效建筑物 ID(那些与 $buildingIds 数组匹配的 ID)并且必须确保它们在 buildings_built 中尚不存在(因此我们知道需要建造哪些建筑物)。它可以很容易地在两个查询中完成,但我试图用一个查询来提高效率:

$buildingIds = ['a1','b2','c3'];

Tables
// buildings       (id, building_name)    (a1, adam)  (b2, barney)  (c3, castor) 
// buildings_built (id, building_id)       (1, a1)     (2, b2)

这是我的尝试,但效果不佳:

$buildingsToBuildFromIdsArray = Buildings::whereIn('buildings.id', $ids)
                                 ->whereNotIn('buildings_built.building_id', $ids)
                                 ->pluck('buildings.id');

理想情况下,查询应该 return ['c3'],因为该建筑存在于 buildings table 而 不存在 buildings_built table(尚未建成)。

知道如何让它正常工作吗?

您可以做的是在两个模型之间建立关系 - 我将使用模型的默认命名为 BuildingBuild:

class Building extends Model
{
    public function builds(): HasMany
    {
        return $this->hasMany(Build::class, 'building_id', 'id');
    }
}

class Build extends Model
{
    public function building(): BelongsTo
    {
        return $this->belongsTo(Building::class, 'id', 'building_id');
    }
}

要获取您的记录,您可以使用 doesntHave 查询生成器方法

Building::whereIn('id', $ids)->doesntHave('builds')->pluck('id');