Laravel与表的关系

时间:2019-03-07 08:54:08

标签: php laravel eloquent

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

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

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

private static <V, E, M extends Map<String, ? extends Iterable<V>>> void RunMap(
    final M results,
    final Asyncc.IAsyncCallback<M, E> f) {

在材料中

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

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

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

编辑:数据库结构

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

5 个答案:

答案 0 :(得分:2)

您使用了错误的关系和错误的模式

如果1种产品具有多种材料,则应为( 1对多

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

  

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

多对多,并使用BELONG对多


答案 1 :(得分:1)

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

因此,您不需要数据透视表;您的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);
    }
}

答案 2 :(得分:1)

尝试这个

  const reduce = data[0].x;

  series: [{
    data: data.map(elem => {
      elem.x = elem.x - reduce;
      return elem;
    })
  }]

答案 3 :(得分:0)

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

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

如果您不想指定任何键,例如product_id,则可以将该键指定为指向某些ID索引表的额外参数。

像这样

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

Laravel Eloquent Relationships

希望这会有所帮助:)

答案 4 :(得分:0)

模型Product.php

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

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

模型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