雄辩的:如何从:: with()结果中“ WhereNotNull”

时间:2018-10-10 15:57:45

标签: php laravel eloquent eloquent--relationship

我正在运行以下具有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”字段为null。如何删除具有objective = null的结果?

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

我的解决方案:

  • 改为使用连接,这样我就可以在同一查询中评估空结果。
  • 使用foreach外观来验证objective字段是否为空,并从返回的列表中删除找到的结果。

2 个答案:

答案 0 :(得分:0)

如果目标表具有'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();

答案 1 :(得分:0)

我发现的解决方案是将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存在的行。