Eloquent:如何从 ::with( ) 结果中 'WhereNotNull'

Eloquent: How to 'WhereNotNull' from a ::with( ) result

我是 运行 以下具有 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();

有时,由于 with 函数中的规则,返回的 'objective' 字段为空。如何删除 objective = null?

的结果

我尝试在 ->get() 之前使用 ->whereHas('objective'),但它没有任何改变。有没有另一种方法来评估 with 函数是否返回 null 保持相同的查询?

我想到的解决方案:

如果 objective table 有 'objective_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();

我找到的解决方案是将 whereHaswith 函数一起使用。查询将是:

$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 存在的行。