#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. Хорошо, просто возвращайтесь, если вам что-нибудь понадобится, и, пожалуйста, проголосуйте или отметьте ответ как правильный 🙂