如何合并多个Eloquent关系?

时间:2017-05-20 14:48:04

标签: laravel eloquent

我使用Laravel 5.4来返回一个人创建或管理的任务。

代码如下:

public function tasks()
{
    $creator = $this->morphMany('App\Task', 'created_by');
    $manager = $this->morphMany('App\Task', 'managed_by');
}

此函数应返回Illuminate\Database\Eloquent\Relations\Relation类型的对象。

我尝试了这两次尝试,但是没有人尝试返回所需的类型:

// using merge:
$task1 = collect([$creator]);
$task2 = collect([$manager]);

return $task1->merge($task2); // it returns an empty collection.

使用查询构建器进行第二次尝试:

return Task::
    where([
        ['created_by_type', '=', 'App\Person'],
        ['created_by_id', '=', $this->id]
    ])
    ->orwhere([
        ['managed_by_type', '=', 'App\Person'],
        ['managed_by_id', '=', $this->id]
    ])->get();
// returns the correct data but not as an object of Illuminate\Database\Eloquent\Relations\Relation

是否可以合并这两个关系并将结果返回为Illuminate\Database\Eloquent\Relations\Relation类型?

2 个答案:

答案 0 :(得分:1)

虽然有可能制作某种黑客或使用包,但我认为你最好的选择是重新考虑一下你的表结构。从我从你的帖子收集到的内容:

Persons
  id
  other_data

Task
  managed_by_type
  managed_by_id
  created_by_type
  created_by_id
  other_data

如果您换到:

Person
  id
  other_data

Task
  id
  other_data

Person_Task
  owner_id
  owner_type
  task_id
  type // managed or created (int)

您将有更灵活的解决方案。

public function tasks()
{
    return $this->morphMany('App\Task', 'owner', 'persons_tasks');
}

public function createdTasks()
{
    return $this->morphMany('App\Task', 'owner', 'persons_tasks')->withPivot('type')->where('type', 0);
}

public function managedTasks()
{
    return $this->morphMany('App\Task', 'owner', 'persons_tasks')->withPivot('type')->where('type', 1);
}

答案 1 :(得分:0)

我想这是不可能的(现在)。