Laravel Eloquent — доступ к модельным отношениям второго уровня

Этот вопрос расширяет пример Eloquent: работа с сводными таблицами предоставлено в документации Laravel.

Здесь отношения таковы, что пользователь имеет много Роль объекты, к которым он может относиться. В этом расширении каждая Роль будет относиться к нескольким объектам Задачи, давая нам второй уровень отношения многих ко многим.

Используя Eloquent ORM, каким будет самый удобный способ доступа к Задачам, к которым относится пользователь?

В частности, следующий метод должен возвращать массив task_ids

User::get_tasks($user_id)

2

Решение

Несмотря на то, что ответ @ JosephSilber выглядит великолепно, он, к сожалению, не сработал, когда я тестировал его, поэтому вот что сработало в моей установке:

public static function get_tasks($id){
$tasks = static::with('roles.tasks')->find($id)->roles->lists('tasks');
$collection = new \Illuminate\Database\Eloquent\Collection();
foreach($tasks as $roleTasks){
$collection = $collection->merge($roleTasks);
}
return $collection;
}

Лично я бы немного изменил синтаксис так:

public function getTasks(){
$this->load('roles.tasks');
$tasks = $this->roles->lists('tasks');
$collection = new \Illuminate\Database\Eloquent\Collection();
foreach($tasks as $roleTasks){
$collection = $collection->merge($roleTasks);
}
return $collection;
}

User::find($user_id)->getTasks();
0

Другие решения

use Illuminate\Database\Eloquent\Collection;

class User extends Eloquent {

// ... relation methods...

public function get_tasks($id)
{
$tasks = static::with('roles.tasks')->find($id)->roles->lists('tasks');

return (new Collection(array_flatten($tasks)))->unique();
}

}
2

Я считаю, что самый лучший способ — использовать отношения hasManyThrough следующим образом:

class User extends Eloquent {
public function get_tasks()
{
return $this->hasManyThrough('Tasks', 'Roles');
}
}

Вам нужно только изменить Tasks а также Roles к вашей названной соответствующей модели. Он вернет вам список задач. Надеюсь это поможет.

0
По вопросам рекламы [email protected]