首页 > 解决方案 > 是否可以将枢轴上的表格与雄辩的 ORM 相关联?

问题描述

这些是我的桌子many-to-many

products并且suppliers,但是我需要将 pivot(product_supplier) 与名为payment_supplier.

在此处输入图像描述

产品型号

 public function suppliers(){
    return $this->belongsToMany('App\Supplier');
}

供应商模式

 public function products(){
    return $this->belongsToMany('App\Product');
}

但我需要将 pivot product_supplier 与 payment_supplier 表相关联,就像图中描述的那样

标签: phplaraveleloquentrelational-database

解决方案


在这种情况下,您可以使用枢轴模型。

# Product Model
public function suppliers() {
    return $this->belongsToMany(Supplier::class)->using(ProductSupplier::class);
}
# Supplier Model
public function products(){
    return $this->belongsToMany(Product::class)->using(ProductSupplier::class);
}
# ProductSupplier Pivot Model
<?php
namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class ProductSupplier extends Pivot
{
    public function payment_supplier()
    {
        return $this->hasMany(PaymentSupplier::class);
    }
}

但是,这样做有一个大问题:您不能急切地加载枢轴的关系。不是没有覆盖(或包)。

另一种方法是使用hasManyThrough

# Product Model
public function suppliers()
{
    return $this->belongsToMany(Supplier::class)->using(ProductSupplier::class);
}

public function payment_suppliers()
{
    return $this->hasManyThrough(PaymentSupplier::class, ProductSupplier::class);
}
# Supplier Model
public function products()
{
    return $this->belongsToMany(Product::class)->using(ProductSupplier::class);
}

public function payment_suppliers()
{
    return $this->hasManyThrough(PaymentSupplier::class, ProductSupplier::class);
}

这为您提供了单个供应商/产品的每个 PaymentSupplier,因此您需要应用某种过滤。


推荐阅读