Laravel Eloquent - 访问二级模型关系
Laravel Eloquent - accessing second level model relationship
此问题扩展了 Laravel 文档中提供的示例 Eloquent : Working With Pivot Tables。
这里的关系是一个User有很多Role对象可以关联。在此扩展中,每个 Role 将与许多 Task 对象相关,从而为我们提供第二级多对多关系。
使用 Eloquent ORM,访问用户相关任务的最简洁方法是什么?
具体来说,下面的方法应该return一个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();
}
}
尽管@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();
我认为最简洁的方法是使用 hasManyThrough 关系,如下所示:
class User extends Eloquent {
public function get_tasks()
{
return $this->hasManyThrough('Tasks', 'Roles');
}
}
您只需要将Tasks
和Roles
修改为您命名的对应型号即可。它应 return 您的任务列表。希望这有帮助。
此问题扩展了 Laravel 文档中提供的示例 Eloquent : Working With Pivot Tables。
这里的关系是一个User有很多Role对象可以关联。在此扩展中,每个 Role 将与许多 Task 对象相关,从而为我们提供第二级多对多关系。
使用 Eloquent ORM,访问用户相关任务的最简洁方法是什么?
具体来说,下面的方法应该return一个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();
}
}
尽管@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();
我认为最简洁的方法是使用 hasManyThrough 关系,如下所示:
class User extends Eloquent {
public function get_tasks()
{
return $this->hasManyThrough('Tasks', 'Roles');
}
}
您只需要将Tasks
和Roles
修改为您命名的对应型号即可。它应 return 您的任务列表。希望这有帮助。