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
。非常感谢你们两位的帮助,你们真是太棒了:)