【问题标题】:Laravel Eloquent Many to Many Relationship between three ModelsLaravel Eloquent 三个模型之间的多对多关系
【发布时间】:2020-03-27 21:11:39
【问题描述】:

考虑我对表countriesproductssuppliers 有以下表结构:

countries
------------------------
id
name
code
product
------------------------
id
name
price
suppliers
------------------------
id
name

product 可以以不同的countries 出售,但supplier 其中的product 可以不同。考虑到这一点,我制作了一个relations 表来跟踪哪个supplier 正在交付哪个product,其中country

relations
------------------------
country_id
product_id
supplier_id

假设我有一个产品A 需要存储在国家USCA,但这些国家的供应商分别是XY。结构看起来像这样:

countries
-------------------------------
id    | name            | code
-------------------------------
1     | United States   | US
2     | Canada          | CA
product
-------------------------------
id    | name            | price
-------------------------------
1     | A               | 3.99
suppliers
------------
id    | name
------------
1     | X
2     | Y
relations
-------------------------------
country_id | product_id | supplier_id
-------------------------------
1          | 1          | 1
2          | 1          | 2

我的问题是如何使用 Eloquent 关系到这个表,因为多对多关系只适用于两个表。还有其他解决方法吗?或者有没有其他有效的方法来实现这个场景?

感谢您的帮助。

【问题讨论】:

    标签: laravel eloquent eloquent-relationship


    【解决方案1】:

    作为Jerodev suggested,我制作了一个中间模型SupplierProduct。我没有建立多对多关系,而是与SupplierProduct 建立一对多关系,并使用with 函数检索数据以检索与该记录相关的所有数据。

    这就是我的模型的样子(数据库结构与所描述的相同):

    SupplierProduct.php

    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class SupplierProduct extends Model {
    
        public function country() {
            return $this->belongsTo(Country::class);
        }
    
        public function product() {
            return $this->belongsTo(Product::class);
        }
    
        public function supplier() {
            return $this->belongsTo(Supplier::class);
        }
    
    }
    

    Country.php

    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Country extends Model {
        public function products() {
            return $this->hasMany(SupplierProduct::class)->with('product', 'supplier');
        }
    }
    

    Product.php

    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Product extends Model {
        public function products() {
            return $this->hasMany(SupplierProduct::class)->with('country', 'supplier');
        }
    }
    

    Supplier.php

    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Supplier extends Model {
        public function products() {
            return $this->hasMany(SupplierProduct::class)->with('country', 'product');
        }
    }
    

    【讨论】:

      【解决方案2】:

      我也有相同的场景类有多个 DaysClassDetails 在你的父模型中使用这个函数

      public function classType()
      {
          return $this->hasMany('App\DaysClassDetails(middlemodel)');
      }  
      

      而且 DaysClassDetails 有多个 DaysClassTimeDetails

      public function classTime()
      {
          return $this->hasMany('App\DaysClassTimeDetails(lastchildmodel)');
      }
      
      public function classType(){
          return $this->belongsTo('App\ManageClass(parentmodel)');
      }
      

      【讨论】:

        【解决方案3】:

        没有使用三个表建立关系的内置方法。每当我自己遇到这样的事情时,最好的解决方案似乎是制作一个与三个表有关系的中间模型。

        因此,在您的情况下,我将创建一个 SupplierProduct,它具有 countrysupplierproduct 的关系。

        【讨论】:

          猜你喜欢
          • 2021-05-16
          • 1970-01-01
          • 2013-05-27
          • 1970-01-01
          • 2023-03-27
          • 2018-05-23
          • 2016-02-06
          • 2018-10-05
          • 2019-06-13
          相关资源
          最近更新 更多