在belongsToMany关系中使用名称列而不是id

Ama*_*ngh 5 mysql laravel eloquent laravel-eloquent

我有两个模型,一个是要约(用于要约表),另一个是品牌(用于品牌表)。这些模型之间存在“多对多”关系。

我有一个表offer_brands,它映射了这两个表之间的关系。在此表中,我具有offer_id列(可将此表链接到商品表)和brand列(可将此表链接到brands表),brands表中的usind brand_name列。

在品牌模型中,我想要一个可以返回所有报价的关系。

我知道我可以做到

public function offers()
{
    return $this->belongsToMany(Offer::class, 'offer_brands', 'offer_id', 'brand_id'); // But don't have brand_id column insted I have brand column that contains brand names
}
Run Code Online (Sandbox Code Playgroud)

另外,我尝试了

public function offers()
{
    return $this->belongsToMany(Offer::class, 'offer_brands', 'offer_id', 'brand'); // But Eloquent compare this column with id column of brands table.
}
Run Code Online (Sandbox Code Playgroud)

Ahm*_*sam 9

以防万一有人仍在寻找答案..以下是解决此问题的方法。

例如,我有用户角色。并且数据透视表 ( team_users) 具有user_id. role_id但它不包含role列,它基本上是表slug中角色的列roles

我可以像这样指定关系:

public function roles()
{
    return $this->belongsToMany('App\Role', 'team_users', 'user_id', 'role', 'id', 'slug');
}
Run Code Online (Sandbox Code Playgroud)

基本上App\Role就是关系模型。

team_users是数据透视表名称。

user_id是外部主键(所以team_users会有一个名为 的列user_id

role是相关的主键(所以team_users会有一个名为 的列role

id是父键(因此在App\UserLaravel 中将查找列值等于数据透视表中的id外键的行)。user_id

slug是相关的键(所以在App\RoleLaravel 中将查找slug列值等于role数据透视表中的列的行)


Ale*_*nin 2

正确的定义:

return $this->belongsToMany(Offer::class, 'offer_brands', 'brand', 'offer_id');
Run Code Online (Sandbox Code Playgroud)

但使用命名约定是个好主意。您可以将表brand_offer和外键命名为offer_idbrand_id。在这种情况下,关系将如下所示:

return $this->belongsToMany(Offer::class);
Run Code Online (Sandbox Code Playgroud)

在我的最佳实践存储库中了解有关Laravel 命名约定的更多信息。