Laravel 5.8 вырвать отношения и использовать локальную область видимости для этих отношений - PullRequest
0 голосов
/ 04 июня 2019

Это кажется довольно простым, но не повезло.У меня есть отношения один ко многим от 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();
});

Кажется, что есть более краткий способ сделать это, но, возможно, нет?Есть идеи по этому поводу?Спасибо!

1 Ответ

1 голос
/ 04 июня 2019

Это можно сделать при запросе вашего $tasks;если вы подождете, пока вы уже извлечете свои Task модели, вам, вероятно, придется делать это в цикле, что является проблемой n + 1.Попробуйте использовать «Eager Loading»:

$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.
}
...