Имеет единую связь в laravel с «сквозной» таблицей

#php #laravel #eloquent #relationship #laravel-8

#php #laravel #красноречивый #связь #laravel-8

Вопрос:

В настоящее время у меня проблема с отношениями.

У меня есть 3 таблицы:

  • фракции:
    • ID
  • роли:
    • ID
  • faction_roles:
    • faction_id
    • role_id

У каждой фракции много ролей, но у каждой роли есть только 1 фракция. Я уже думал о создании столбца faction_id в моей таблице ролей, но я хотел решить его только с помощью faction_roles, поэтому мне не нужно добавлять данные в 2 таблицы.

Моя модель для подражания выглядит так:

  public function faction()
 {
    return $this->hasOne(Faction::class, 'faction_roles.faction_id', 'faction_roles.role_id');
 }
  

Я уже пробовал это с помощью $this->belongsTo(фракция::класс), но не сработало.

Заранее спасибо!

Приветствия

Ответ №1:

Я не вижу проблемы, если вы определяете отношения, как вы это делали в модели фракций:

 public function factions() {
    return $this->belongsToMany(Faction::class);
}
  

Затем метод отношения вернет один элемент, вы можете запросить первый элемент отношения, если хотите, вот так:

 $role->factions->first();
  

Или:

 $role->factions()->first();
  

Разницу смотрите в разделе «Быстрая загрузка»

Что еще вам нужно именно?

Комментарии:

1. Но оно принадлежит не многим фракциям, а только одной. Итак, есть ли способ заставить $role-> faction работать без получения набора ролей и просто получить 1 роль?

2. Но дело в том, что оно принадлежит многим, поэтому обходным путем может быть создание другого метода класса, который возвращает только фракцию роли, но не будет рассматриваться как отношение.

3. Я думаю, что нашел обходной путь, используя средство доступа. Поэтому верните $role->factions->first() . Это, по крайней мере, очищает мой код. Спасибо за ваши ответы 🙂

4. Хорошо, просто возвращайтесь, если вам что-нибудь понадобится, и, пожалуйста, проголосуйте или отметьте ответ как правильный 🙂