Laravel 5.8选择了一个关系并使用该关系的本地范围

时间:2019-06-04 19:53:40

标签: php laravel laravel-5 eloquent laravel-5.8

这似乎很简单,但是没有任何运气。我与TaskBlock有一对多的关系。关系: 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();
});

似乎有一种更简洁的方法可以解决这个问题,但也许不是吗?有什么见解吗?谢谢!

1 个答案:

答案 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.
}