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(尚未建成)。
知道如何让它正常工作吗?
您可以做的是在两个模型之间建立关系 - 我将使用模型的默认命名为 Building
和 Build
:
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');
我有两个 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(尚未建成)。
知道如何让它正常工作吗?
您可以做的是在两个模型之间建立关系 - 我将使用模型的默认命名为 Building
和 Build
:
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');