Я запускаю следующий запрос, который имеет 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
функция вернула ноль, сохраняя тот же запрос?
Решения, которые у меня есть на голове:
objective
поле пустое и удалить найденные результаты из моего возвращенного списка.Если в таблице целей в качестве первичного ключа задан ‘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();
Я нашел решение использовать 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
существует будет возвращено.