Красноречивый: Как сделать 'WhereNotNull' из результата :: with () - PullRequest
0 голосов
/ 10 октября 2018

Я выполняю следующий запрос с отношением with().

$logbook_objectives = self::whereIn('lobjective_id',  $logbook_objectives_ids)
    ->with(['objective' => function($q) use ($course_objective_ids){
         $q->select(['objective_id', 'objective_code', 'objective_name'])
           ->whereIn('objective_id', $course_objective_ids)
           ->whereIn('objective_parent', $course_objective_ids, 'or');
     }])
     ->withCount(['entryObjectives' => function ($q) use ($learner_id) {
          $q->where('created_by', $learner_id);
     }])
     ->get();

Иногда возвращаемое поле 'target' является пустым из-за правил в функции with.Как удалить результаты, которые имеют objective = null?

Я пытался использовать ->whereHas('objective') до ->get(), но это ничего не меняет.Есть ли другой способ оценки, если функция with вернула ноль, сохраняя тот же запрос?

Решения, которые у меня на голове:

  • Вместо этого используйте объединение, чтобы я мог оценивать нулевые результаты в одном и том же запросе.
  • Используйте внешний вид foreach, проверяющий, еслиobjective поле пустое и удалить найденные результаты из моего возвращенного списка.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я нашел решение использовать whereHas вместе с функцией with.Запрос будет выглядеть так:

$logbook_objectives = self::whereIn('lobjective_id',  $logbook_objectives_ids)
    ->with(['objective' => function($q) use ($course_objective_ids){
         $q->select(['objective_id', 'objective_code', 'objective_name'])
           ->whereIn('objective_id', $course_objective_ids)
           ->whereIn('objective_parent', $course_objective_ids, 'or');
     }])
     ->whereHas('objective', function($q) use ($course_objective_ids){
         $q->select(['objective_id', 'objective_code', 'objective_name'])
           ->whereIn('objective_id', $course_objective_ids)
           ->whereIn('objective_parent', $course_objective_ids, 'or');
     })
     ->withCount(['entryObjectives' => function ($q) use ($learner_id) {
          $q->where('created_by', $learner_id);
     }])
     ->get();

В этом случае будут возвращены только те строки, которые существуют objective.

0 голосов
/ 10 октября 2018

Если в таблице объективов в качестве первичного ключа указан 'target_id' или любой другой ключ, поместите этот ключ в whereNotNull, как указано ниже:

$logbook_objectives = self::whereIn('lobjective_id',  $logbook_objectives_ids)
    ->with(['objective' => function($q) use ($course_objective_ids){
         $q->select(['objective_id', 'objective_code', 'objective_name'])
           ->whereIn('objective_id', $course_objective_ids)
           ->whereIn('objective_parent', $course_objective_ids, 'or')->whereNotNull('objective_id');
     }])
     ->withCount(['entryObjectives' => function ($q) use ($learner_id) {
          $q->where('created_by', $learner_id);
     }])
     ->get();
...