1

我正在运行以下具有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

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

我头上的解决方案:

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

2 回答 2

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();
于 2018-10-10T18:14:44.873 回答
0

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

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

于 2018-10-30T20:27:56.807 回答