这似乎很简单,但是没有任何运气。我与Task
到Block
有一对多的关系。关系:
Task->blocks
:
public function blocks()
{
return $this->hasMany(Block::class, 'task_uuid', 'task_uuid');
}
Blocks->task
:
public function task()
{
return $this->belongsTo(Task::class, 'task_uuid', 'task_uuid');
}
这样,我可以获得任务的所有块,例如:$task->blocks;
。我正在尝试从以下一系列任务中剔除所有问题:$tasks->pluck('blocks')
,并使用Block
模型上的本地范围:
public function scopeUnresolved($query)
{
return $query->where('resolved_at', null);
}
我的一些尝试(甚至超级愚蠢的尝试):
$tasks->pluck('blocks')->unresolved()->get();
$tasks->pluck('blocks')->flatten()->unresolved()->get();
$tasks->pluck('blocks')->filter()->get()->unresolved()->get();
还有其他一些。我已经开始工作了:
$tasks->pluck('blocks')->flatten()->filter(function ($block) {
return $block->unresolved()->get();
});
似乎有一种更简洁的方法可以解决这个问题,但也许不是吗?有什么见解吗?谢谢!
答案 0 :(得分:1)
这可以在查询您的$tasks
时完成;如果您在拉出Task
模型之后等到直到,您可能必须循环执行此操作,这是一个n + 1问题。尝试使用“快速加载”:
$tasks = Task::with(["blocks" => function($subQuery){
$subQuery->whereNull("resolved_at");
// or, if you want to use your `scopeUnresolved()`
$subQuery->unresolved();
}])->get();
注意:where("unresolved_at", null)
可能有效或无效,但是有一种whereNull()
方法
现在,当您尝试访问任务的块时,它将仅包含未解析的块:
foreach($tasks AS $task){
dd($task->blocks);
// etc.
}