我使用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
类型?
答案 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)
我想这是不可能的(现在)。