Laravel 5.5 - whereIn和whereNotIn在同一个雄辩的查询中?

时间:2018-04-16 19:47:50

标签: laravel laravel-5 eloquent laravel-5.5

我有两个表,我需要<div class="triangle-down"></div> <style> .triangle-down { width: 0; height: 0; border-left: 15px solid transparent; border-right: 15px solid transparent; border-top: 20px solid #555; } </style> pluck中存在的有效构建ID(与$buildingIds数组匹配的那些)并且必须确保它们不存在于buildingsbuildings_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');

理想情况下,查询应该返回['c3'],因为该版本存在于buildings表格中,buildings_built表格中存在(尚未构建) )。

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

1 个答案:

答案 0 :(得分:1)

您可以做的是在两个模型之间创建关系 - 我将使用模型的默认命名为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');