【问题标题】:Laravel Relationships with a tableLaravel 与表格的关系
【发布时间】:2019-07-29 02:15:11
【问题描述】:

我目前正在苦苦挣扎,因为我对 Laravel 中的关系还很陌生。 我有一个模型产品,它由一种模型材料制成。 材料可用于多种产品。

我有一个名为 product_material 的表来链接它们。

到目前为止我所拥有的 在产品中

public function material()
{
    return $this->hasOne(Material::class, '');
}

在材料中

 public function products(){
    return $this->hasMany(Product::class, 'product_material');
}

但这给了我一个错误,说我的材料表中没有任何 product_id。

但是:我的材料不应该有 product_id,因为它在创建时没有链接到任何东西,它可以在多个产品中使用

编辑:数据库结构

Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->softDeletes();
        $table->string('code',45);
});

Schema::create('materials', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->softDeletes();
        $table->string('code',45);
});
Schema::create('product_material', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->softDeletes();
        $table->integer('product_id');
        $table->integer('material_id');
    });

【问题讨论】:

  • 能分享一下数据库结构吗?

标签: php laravel eloquent


【解决方案1】:

试试这个

public function products(){
    return $this->hasMany('App\Product', 'id','product_id');
}

【讨论】:

    【解决方案2】:

    您使用了错误的关系和错误的架构

    如果 1 个产品有多种材料,那么它应该是(1 到多个

    现在一种材料也有很多产品,所以关系应该是

    简而言之,一种产品具有多种材料,一种材料具有 几个产品,所以最后的关系应该是:

    MANY TO MANY 并使用 BELONG TO MANY


    【讨论】:

      【解决方案3】:

      如果您确定一个产品永远只有一种材料,那么这将是一个属于/有很多关系。一个产品可以有一个材料,但材料可以有很多产品。

      因此您不需要数据透视表;您的products 表将有一个material_id,它是materials 表的外键。

      class Material extends Model
      {
          public function product()
          {
              return $this->hasMany(Product::class);
          }
      }
      
      class Product extends Model
      {
          public function material()
          {
              return $this->belongsTo(Material::class);
          }
      }
      

      【讨论】:

        【解决方案4】:

        型号Product.php

        public function materials()
        {
           return $this->belongsToMany(Material::class, 'product_material');
        }
        

        您可以直接从您的product 表中获取materials

        型号ProductMaterial.php

        public function material()
        {
                return $this->belongsTo(Material::class, 'material_id');
        }
        
        public function product()
        {
                return $this->belongsTo(Product::class, 'product_id');
        }
        

        参考:Laravel Eloquent Relationship

        【讨论】:

          【解决方案5】:

          您在此处指定了空字符串。

          public function material()
          {
              return $this->hasOne(Material::class);
          }
          

          如果您不想指定任何键,例如 product_id,那么您将该键指定为指向某个 id anohter 表的额外参数。

          喜欢这个

          return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
          

          对于微尘Laravel Eloquent Relationships

          希望这会有所帮助:)

          【讨论】:

          • 感谢您的回答,但我没有任何外键。只是一个表格作为两个模型之间的链接
          • 好吧,我还被告知,如果你没有指定任何外键,你如何指定另一个键,默认情况下,laravel 会自动将外键作为 (_id) 约定。如果您没有按照该约定的列,则可以在关系的方法中指定。
          猜你喜欢
          • 2021-01-09
          • 2018-10-20
          • 2021-05-08
          • 2020-06-12
          • 2017-07-22
          • 2017-04-14
          • 2021-01-27
          • 2021-01-14
          • 1970-01-01
          相关资源
          最近更新 更多