Laravel 5.5-在同一个雄辩的问题中,何处不存在?

Laravel 5.5-在同一个雄辩的问题中,何处不存在?,laravel,laravel-5,eloquent,laravel-5.5,Laravel,Laravel 5,Eloquent,Laravel 5.5,我有两个表,需要提取建筑物中存在的有效建筑物ID(与建筑物中存在的$buildingIds数组匹配的ID),并且必须确保它们在建筑物中不存在(因此我们知道需要建造哪些建筑物)。这可以在两个查询中轻松完成,但为了提高效率,我尝试使用单个查询: $buildingIds = ['a1','b2','c3']; Tables // buildings (id, building_name) (a1, adam) (b2, barney) (c3, castor) // bui

我有两个表,需要
提取
建筑物中存在的有效建筑物ID(与
建筑物中存在的
$buildingIds
数组匹配的ID),并且必须确保它们在
建筑物中不存在(因此我们知道需要建造哪些建筑物)。这可以在两个查询中轻松完成,但为了提高效率,我尝试使用单个查询:

$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']
,因为该建筑物存在于
建筑物
表中,而不存在于
建筑物_builded
表中(尚未建造)


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

你可以做的是在两个模型之间创建一个关系-我将使用模型的默认命名为
Building
Build

类构建扩展了模型
{
公共函数builds():有许多
{
返回$this->hasMany(Build::class,'building_id','id');
}
}
类构建扩展了模型
{
公共功能楼():BelongsTo
{
返回$this->belongsTo(Building::class,'id','Building_id');
}
}
要获取记录,可以使用
doesntHave
query-builter方法

Building::其中('id',$id)->doesntHave('builds')->pull('id');

您需要先加入(…)
他们。那么查询应该可以工作了。@devk我尝试在id/building\u id上加入,但它是一个空数组。表之间有什么关系?如果他们没有任何关系,你将无法加入他们。很抱歉最初没有这么清楚,我改进了这个问题,使之更加实际,但目前没有建立任何关系。如果在单个查询中更容易,我也愿意使用
DB::
而不是直接使用模型。很抱歉,最初没有这么清楚,我改进了这个问题,使之更实用,但目前还没有建立关系。我也愿意用
DB::
而不是直接用模型来做,如果在单个查询中更容易的话。我已经更新了我的答案-我将模型名称保留为Singular,但可以随意更新。这实际上是一个非常好的解决方案。除非,如果我理解正确,您希望
->doesntHave(..)
而不是
->where have(..)
。除此之外,这应该可以满足您的需要。基本上,您希望按照Sebastian的建议设置模型和关系,并执行以下查询:
Building::where('id',$id)->doesntHave('builds')->pull('id')
@SebastianSulinski感谢您提供了这些关系,它们现在可以在注释中使用@devk query。我真的很喜欢
->doesntHave('builds')
部分,那是纯genius@devk!要补充的是,如果另一个
where
子句需要与
doesntHave
连用,只需将其转换为闭包,但将其改为
whereDoesntHave
。否则,
doesntHave
将无法使用闭包
where
。非常感谢你们两位的帮助,你们真是太棒了:)