实际上不确定我是正确地做了还是有其他方法。我的数据库中包含以下内容
brands
id: integer
name: string
slug: string
description: string
timestamp
products
id: integer
name: string
price: decimal
slug: string
description: string
timestamp
brand_product
id: integer
brand_id: unsignedInteger
product_id: unsignedInteger
基本上,品牌有很多产品,所以我的品牌型号
...
public function products()
{
return $this->belongsToMany(Product::class);
}
...
但是,产品有一(1)个品牌型号。非常确定我可以通过在brand_id
表上添加products
来实现我想要的,并在我的产品模型上执行关系。但是,我有一个上面的数据库结构。我在我的产品型号上做了什么:
...
protected $appends = ['brand'];
public function brand()
{
return $this->belongsToMany(Brand::class);
}
public function getBrandAttribute()
{
return $this->brand()->first();
}
...
答案 0 :(得分:3)
您在产品上添加brand_id
的假设是正确的。您所描述的是一对多关系,但是表示多对多的数据库结构。删除数据透视表并将品牌ID添加到产品表中,您就可以了。
// Product model
public function brand()
{
return $this->belongsTo(Brand::class);
}
// Brand model
public function products()
{
return $this->hasMany(Product::class);
}
https://laravel.com/docs/5.5/eloquent-relationships#one-to-many
答案 1 :(得分:1)
最好的方法是删除数据透视表并定义一对多关系。
但是,如果必须使用数据透视表保留模式,只需将belongsToMany()放在两个模型上即可。 Laravel中没有belongsToMany()的特定反转。
https://laravel.com/docs/5.5/eloquent-relationships#many-to-many
答案 2 :(得分:0)
在您的产品模型中添加以下代码:
public function brands()
{
return $this->belongsToMany('App\Brand', 'brand_product');
}
现在,您可以通过在控制器中使用以下代码来获得产品品牌的第一行:
$product->brands()->get()->first(); // Will return the first row