Красноречивый: Как сделать ‘WhereNotNull’ из результата :: with ()

Я запускаю следующий запрос, который имеет 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 поле пустое и удалить найденные результаты из моего возвращенного списка.

1

Решение

Если в таблице целей в качестве первичного ключа задан ‘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();
0

Другие решения

Я нашел решение использовать 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

По вопросам рекламы [email protected]