Можно ли связать таблицу на сводной с красноречивым ORM? - PullRequest
0 голосов
/ 17 октября 2019

Это мои таблицы many-to-many:

products и suppliers, однако мне нужно связать сводную точку (product_supplier) с таблицей с именем payment_supplier.

enter image description here

Модель продукта

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

Модель поставщика

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

но янеобходимо связать сводный product_supplier с таблицей payment_supplier, как описано на диаграмме

1 Ответ

0 голосов
/ 17 октября 2019

В этом случае вы можете использовать модель сводной диаграммы.

# 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 для одного поставщика /Продукт, поэтому вам нужно применить какую-то фильтрацию.

...