Laravel: как использовать множественные отношения опорных таблиц

Я новичок в определении отношений и фреймворков, я просто использовал для сырого sql. Была ли моя домашняя работа (документация google + laravel), но я думаю, что просто не понимаю ее должным образом.

Heres – соответствующая информация: Таблица пользователей:

Table: Users id - int (auto increment) username - varchar 

Таблица проблем:

 Table: Challenges id - int (auto increment) name - varchar 

User_challenge_links

 Table User_challenge_links id - int (auto increment) user_id - int challenge_sub_categories_id - int 

Challenge_sub_categories

 Table Challenge_sub_categories id - int (auto increment) category_id - sub_category_id - challenge_id - 

Итак, моя цель .. пользователь-> проблемы.

 class User extends Eloquent { protected $table = "users"; public function challenges() { // get user-> challenges } } 

Отношения:

  • Пользователь имеет много User_challenge_links
  • Пользователь User_challenge_link имеет challenge_sub_categories_id (таким образом, challenge_sub_category)
  • Задача challenge_id из tasks_sub_categories соответствует задаче в таблице проблем

Любая помощь, даже указывая мне в правильном направлении, будет очень признательна!

Изменить: пример данных: данные пользователей

 Users id name 1 "Sjaak" 2 "Henk" 

Категории Идентификатор данных 1 "Foo" 2 "Bar"

Sub_categories Идентификатор данных 1 «SubFoo» 2 «SubBar»

Вызовы Идентификатор данных 1 «Swing dat Foo» 2 «Соедините все вещи» 3 «Foo The Bars»

Данные Challenge_sub_categories

 id category_id sub_category_id challenge_id 1 1 1 1 2 2 1 1 3 1 2 2 4 2 1 3 5 2 2 2 

Данные пользователя User_challenge_links

 id user_id Challenge_sub_categories_id 1 1 1 2 1 3 3 2 2 4 2 3 5 2 4 

Поток данных:
Пользователь может создавать категории или использовать существующие и связывать с ними проблемы (существующие или новые). Однако пользователь также может использовать подкатегорию, которую он затем связывает с категорией и связанными с ней проблемами.
Таким образом, категория обязательна, но sub_category нет. Если, однако, используется sub_category (снова .. существующий или новый), проблема будет связана с этой подкатегорией.

Примечание. Подкатегория МОЖЕТ подключаться к нескольким категориям

 category - House sub_category - Cleaning Challenge - getting special soap category - Car sub_category - Cleaning Challenge - getting special soap category - Showering Challenge - getting special soap 

Это некоторые возможные ситуации

Эта настройка должна вас поймать. Я попытался сохранить наименование как можно более простым.

 users id username challenge_user user_id challenge_id challenges id name topic_id category_id topics id name categories id name 

Определение ярко выраженных моделей

 class User extends Eloquent { public function challenges() { return $this->belongsToMany('Challenge'); } } class Challenge extends Eloquent { public function users() { return $this->belongsToMany('User'); } public function topic() { return $this->belongsTo('Topic'); } public function category() { return $this->belongsTo('Category'); } } class Topic extends Eloquent { public function challenges() { return $this->hasMany('Challenge'); } } class Category extends Eloquent { public function challenges() { return $this->hasMany('Challenge'); } } 

Используя ваши «Красноречивые модели» … просто некоторые примеры того, что вы можете сделать.

 // Collection of all Challenges by Topic name Topic::with('challenges')->whereName($topic_name)->first()->challenges; // Collection of all Challenges by Category name Category::with('challenges')->whereName($category_name)->first()->challenges; // Collection of all Users by Challenge id Challenge::with('users')->find($challenge_id)->users; // Collection of Users with atleast 2 Challenges User::has('challenges', '>', 1)->get(); // Attach Challenge to User $user = User::find($id); $user->challenges()->attach($challenge_id); // Assign a Topic to a Challenge $challenge = Challenge::find($challenge_id); $topic = Topic::find($topic_id); $challenge->topic()->associate($topic); $challenge->save(); 

Ссылки и предлагаемое чтение:

belongsTo Взаимоотношения, belongsTo belongsToMany hasMany belongsTo belongsToMany hasMany

Запрос отношений Model::has()

Полная Model::with() загрузки Model::with()

Динамические свойства для доступа к отношениям Решают связь $model->relationship

Вставка связанных моделей attach() associate()

Области запросов

Работа со сводными таблицами Если вам нужно получить дополнительные данные из сводной таблицы.