这个问题扩展了 Laravel 文档中提供的 Eloquent示例:使用数据透视表。
这里的关系是一个用户有许多可以关联的角色对象。在这个扩展中,每个角色都将与许多任务对象相关联,从而为我们提供了第二级多对多关系。
使用 Eloquent ORM,访问与用户相关的任务的最佳方式是什么?
具体来说,以下方法应该返回一个 task_ids 数组
User::get_tasks($user_id)
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
为你命名对应的模型。它会返回一个任务列表。希望这可以帮助。
尽管@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();