Этот вопрос расширяет пример Eloquent: работа с сводными таблицами предоставлено в документации Laravel.
Здесь отношения таковы, что пользователь имеет много Роль объекты, к которым он может относиться. В этом расширении каждая Роль будет относиться к нескольким объектам Задачи, давая нам второй уровень отношения многих ко многим.
Используя Eloquent ORM, каким будет самый удобный способ доступа к Задачам, к которым относится пользователь?
В частности, следующий метод должен возвращать массив task_ids
User::get_tasks($user_id)
Несмотря на то, что ответ @ 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();
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();
}
}
Я считаю, что самый лучший способ — использовать отношения hasManyThrough следующим образом:
class User extends Eloquent {
public function get_tasks()
{
return $this->hasManyThrough('Tasks', 'Roles');
}
}
Вам нужно только изменить Tasks
а также Roles
к вашей названной соответствующей модели. Он вернет вам список задач. Надеюсь это поможет.