Laravel 5反向属于theMoMany

时间:2018-02-02 15:11:06

标签: php laravel

实际上不确定我是正确地做了还是有其他方法。我的数据库中包含以下内容

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();
}
...

3 个答案:

答案 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