laravel 获取具有所有特定相关模型的模型

pb3s4cty  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(156)

我不知道如何解决我的问题。
我们有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"表中的列,而不是透视表中的列

lpwwtiir

lpwwtiir1#

我看不出您在哪里加载了包含详细信息的关系。不确定您是否丢失了某个文件,但如果您没有丢失,请使用eager loading with方法在查询的第一部分加载关系:

$builder = Model1::with('details')->filter(new ModelListFilter($request));
ia2d9nvy

ia2d9nvy2#

你就快成功了但还缺两样东西,

位置列表

要在列表中获取型号whereHas的详细信息id,您需要使用WhereIn而不是循环查询

急于加载明细关系

要获取每个模型的详细信息列表,必须使用with关键字来立即加载关系
溶液

// builder
$builder = Model1::with('details')->filter(new ModelListFilter($request));

// filter
$request->whenFilled('details', function (array $details) {
       $this->builder->whereHas('details', function (Builder 
            $innerQuery) use ($details) {
                    $innerQuery->whereIn('detail_id',  $details);
            }
        });

相关问题