我不知道如何解决我的问题。
我们有Model1
,关系为:
class Model1 extends BaseModel
{
public function details(): BelongsToMany
{
return $this->belongsToMany(
Detail::class,
'model1_details',
'model1_id',
'detail_id',
);
}
}
model1_details
是我的透视表。
我也有一个细节id的数组,比如[1, 2, 3]
。我需要获取Model1
,它属于所有具有给定id的Detail
。
我需要在我的过滤器里做这个。这就是我控制器里的东西:
$builder = Model1::filter(new ModelListFilter($request));
和模型列表筛选器内部:
protected function filter(): Builder
{
$request = $this->request;
$request->whenFilled('details', function ($query) {
//
});
return $this->builder;
}
我试过了
$request->whenFilled('details', function ($query) {
foreach($query as $detailId) {
$this->builder->whereHas('details', function (Builder $innerQuery) use ($detailId) {
$innerQuery->where('detail_id', $detailId);
});
}
});
但它返回所有模型Model1,甚至不返回任何细节。
- 统一采购司**
所以问题不在那里=)'details'
只是没有填充在我的请求中。而且我的$query
是一个字符串,而不是数组,所以我对它调用了json_decode。
上面的代码检索属于id = 1的详细信息和id = 2的详细信息的模型,依此类推。
但我认为可能有更好的解决办法,所以我将这个问题留到以后讨论
- 统一方案主任2**
也改变了这个
$innerQuery->where('detail_id', $detailId);
到这个
$innerQuery->where('id', $detailId);
因此需要在此处传递"details"表中的列,而不是透视表中的列
2条答案
按热度按时间lpwwtiir1#
我看不出您在哪里加载了包含详细信息的关系。不确定您是否丢失了某个文件,但如果您没有丢失,请使用eager loading
with
方法在查询的第一部分加载关系:ia2d9nvy2#
你就快成功了但还缺两样东西,
位置列表
要在列表中获取型号
whereHas
的详细信息id,您需要使用WhereIn
而不是循环查询急于加载明细关系
要获取每个模型的详细信息列表,必须使用
with
关键字来立即加载关系溶液