Использование столбца имени в отношении ownToMany вместо идентификатора
У меня есть две модели: одна - Предложение (для таблицы предложений), а другая - Бренд (для таблицы брендов). Между этими моделями существует связь "многие ко многим".
У меня есть таблица offer_brands, которая отображает отношения между этими двумя таблицами. В этой таблице у меня есть столбец offer_id, который связывает эту таблицу с таблицей предложений и столбцом бренда, который связывает эту таблицу с таблицей брендов usind brand_name столбца в таблице брендов.
В Brand Model я хочу отношения, которые возвращают все предложения.
Я знаю, что могу сделать это как
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
}
Также я попробовал
public function offers()
{
return $this->belongsToMany(Offer::class, 'offer_brands', 'offer_id', 'brand'); // But Eloquent compare this column with id column of brands table.
}
2 ответа
На всякий случай, если кто-то все еще ищет ответ.. вот как вы можете решить эту проблему.
Например, у меня есть роли для пользователей. и сводная таблица (team_users
) имеет user_id
, Но вместо того, чтобы содержать role_id
это содержит role
столбец, который в основном является slug
роли в roles
Таблица.
Я могу указать отношение точно так:
public function roles()
{
return $this->belongsToMany('App\Role', 'team_users', 'user_id', 'role', 'id', 'slug');
}
В принципе App\Role
это модель отношений.
team_users
имя сводной таблицы
user_id
является внешним ключом поворота (так в team_users
там будет столбец с именем user_id
)
role
это связанный ключ поворота (так в team_users
там будет столбец с именем role
)
id
является родительским ключом (так в App\User
Laravel будет искать строки, чьи id
значение столбца равно внешнему ключу поворота user_id
в сводной таблице).
slug
это связанный ключ (так в App\Role
Laravel будет искать строки, чьи slug
значение столбца равно role
столбец в сводной таблице)
Правильное определение:
return $this->belongsToMany(Offer::class, 'offer_brands', 'brand', 'offer_id');
Но это хорошая идея использовать соглашения об именах. Вы могли бы назвать таблицу brand_offer
и внешние ключи как offer_id
а также brand_id
, В этом случае отношения будут выглядеть так:
return $this->belongsToMany(Offer::class);
Узнайте больше о соглашениях об именах Laravel в моем репозитории с лучшими практиками.