Laravel / Eloquent - моделирование отношений HasOne с помощью отношений BelongsToMany - PullRequest
1 голос
/ 07 ноября 2019

Скажем, у меня есть четыре таблицы:

  • пользователи
  • группы
  • действия
  • group_activities

Гдегруппа может иметь любое число activities, а действие может принадлежать любому числу groups через промежуточную таблицу group_activities, а пользователь принадлежит одной группе через users.group_id. Я хочу правильно смоделировать отношения между users и activities, чтобы пользователь мог иметь любое действие one , но только если группа, к которой принадлежит пользователь, имеет отношение к этому действию.

Похоже, что HasOneThrough здесь не работает, поскольку группа, с которой связан пользователь, выполняет несколько действий. HasManyThrough не работает, поскольку у пользователя может быть только одно.

Я хочу правильно смоделировать это отношение, чтобы его можно было автоматически выбрать для выбора через поле отношения Nova, но я изо всех сил пытаюсь выяснитькак бы я это сделал. Моя первая мысль - это отношение HasOneThrough с некоторым набором подзапросов, но я не совсем могу разобраться, с чего начать.

Как мне это сделать, или, наоборот, возможно ли это вообще с помощью автоматической системы отношений Eloquent?

1 Ответ

2 голосов
/ 08 ноября 2019

Чтобы убедиться, что мы находимся в едином представлении о ваших отношениях:

Отношения между группами и действиями - это отношение «многие ко многим» ( «Многие ко многим - документация высокого уровня» ).

Таблица group_activities является сводной таблицей.

Отношения между пользователями и группами - это отношение один ко многим Один ко многим - документация высокого уровня и обратное значениеit One To Many (Inverse) - документация Larvel .

Чтобы действительно ответить на ваш вопрос:

Если вы хотите использовать ярлык от пользователейВ их действиях есть Много Через, это правильный путь. Если у группы может быть произвольно много действий, и пользователь принадлежит к одной группе, пользователь будет связан с этими произвольно многими действиями через группу -hence Has Many Through. Обратите внимание, что это на самом деле не отдельное отношение, а просто удобный ярлык.

Если вы не хотите связывать пользователя с одним действием напрямую, вам нужно сделать это через отдельное отношение «Один ко многим». между пользователями и действиями.

Я не совсем уверен, правильно ли я интерпретирую ваш вопрос, поэтому следующее является лишь предположением, но вы хотите убедиться, что пользователь может быть связан только с действием, которое также связанос группой пользователей? Таким образом, чтобы ограничить возможные виды деятельности группой? В этом случае вам просто нужно проверить, относится ли выбранное действие к действиям, связанным с группой пользователей:

С такими настроенными отношениями:

class User {

    public function activity(){
        return $this->belongsTo('App\Activity');
    }

    public function possibleActivities(){
         return $this->hasManyThrough('App\Activity','App\Group');
    }
}

Вы можете проверить и связать действия, как это:

if( $user->possibleActivities()->contains( $activity ) ){
    $user->activity()->associate($activity);
}
...