Load 方法中关系的 Laravel 查询关系

Laravel query relation of relation in load method

提问人:Herokiller 提问时间:5/31/2023 更新时间:5/31/2023 访问量:59

问:

我有 2 个模型:它们通过带有附加字段的表格连接SupplierProductSupplierProduct

对于给定的,我需要加载它(带有附加的产品)按两者和模型中的条件过滤$supplierSupplierProductswhereSupplierProductProduct

加载所有内容将如下所示:

$supplier->load([
   'supplierProducts.product'
]);

现在我怎样才能加载两者的条件?SupplierProductProduct

$supplier->load([
    'supplierProducts' => function ($query) use ($supplierProductParam, $productParam) {
        $query->where('field', $supplierProductParam);       
        // can I query supplierProducts.product here?         
     }, // or can I query supplierProducts.product here?
]);

php laravel laravel-8 急切加载

评论

1赞 Karl Hill 5/31/2023
$query->where('field', $supplierProductParam) ->whereHas('product', function ($query) use ($productParam) { $query->where('product_field', $productParam);
0赞 Herokiller 5/31/2023
@KarlHill我认为就是这样,现在我想知道如何将其加载为 (hasMany),而 pivot 具有相同的查询参数?productssupplier_products
0赞 lagbox 5/31/2023
为什么要为数据透视表创建关系?它由关系自动处理......如果设置正确,则可以使用诸如根据数据透视表进行过滤之类的功能BelongsToManywherePivot

答:

0赞 user7309871 5/31/2023 #1

将它们定义为彼此之间的多对多关系,在定义中使用 withPivot 的 belongsToMany。该关系具有 wherePivot 方法来调节透视模型。

return $this->belongsToMany(Role::class)->withPivot('active', 'created_by')

您也可以在关系上使用 where。https://laravel.com/docs/10.x/eloquent-relationships#filtering-queries-via-intermediate-table-columns

Suplier::query()->with('products', function (Relation $relation): void {$relation->wherePivot(....);});
0赞 jmvcollaborator 5/31/2023 #2

如果要在多对多关系中添加其他筛选器,可以使用:

wherePivot('id', 1) 

wherePivotIn('id', [1])

更多官方信息在这里

就您而言:

$supplier->load([
    'supplierProducts' => function ($query) use ($supplierProductParam, $productParam) {
      $query->where('field',$supplierProductParam)->wherePivotIn('fieldonmanytomany',$supplierProductParam);       
      },
]);