Использование столбца имени в отношении 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 в моем репозитории с лучшими практиками.

Другие вопросы по тегам