【问题标题】:How can I limit selected columns from an eloquent relationship?如何从雄辩的关系中限制选定的列?
【发布时间】:2023-03-12 20:47:01
【问题描述】:

我有 3 个项目的概念,所有项目都存储在数据库中,并在它们之间定义了关系。这些项目反映了对调查的回答。这些表格是:

结果:id、enrolment_id、assessment_id、完成(int)、时间戳 result_answers:id、result_id、answer_id、时间戳 答案:id、answer_plain、answer_html、时间戳

我正在尝试构建一个包含以下内容的对象:

Results (array){
  id, enrolment_id, assessment_id, created_at
  Result_answers (array){
    Answer{
      id,answer_plain
    }
  }
}

我正在使用以下代码:

$result = Result::where('enrolment_id', '=', $id)
    ->where('completed', '=', 1)
    ->with(['result_answers' => function($query) {
        $query->with(['answer' => function($query) {
            $query->select('id', 'answer_plain');
        }]);
    }])
    ->select(['id', 'enrolment_id', 'created_at'])
    ->get();
return response()->json($result);

不幸的是,这给了我很多不需要的字段,有效地输出了每个关系中每个表中的每个字段。如何限制输出的内容?这似乎主要是result_answers 的问题,因为我不需要该表输出的任何数据,只需要与answer 的关系(这是有效的)。

我尝试为 with() 提供一个空的 ->select(),但没有成功。

任何帮助表示赞赏。

【问题讨论】:

    标签: php laravel laravel-5 eloquent laravel-5.2


    【解决方案1】:

    您可以将get() 中所需的所有字段作为数组键函数传递,如下所示:

    $results = Result::where('enrolment_id', '=', $id)
    ->where('completed', '=', 1)`
      ->with(['answers' => function($query) {
        $query->get(['id', 'answer_plain']);
      }])->get(['id', 'enrolment_id', 'created_at'])
    

    【讨论】:

      【解决方案2】:

      ResultAnswer 之间存在多对多关系,您不必真正关心中间 result_answers 表。您也不应该在模型中定义与 results_answers 表的关系。

      所有与加载数据相关的工作都应由 Eloquent 完成,前提是您正确定义了关系。

      您的模型应包含以下关系:

      class Result extends Model {
        public function answers() {
          return $this->belongsToMany(Answer::class, 'results_answers');
        }
      }
      

      通过定义,您应该能够以更简单的方式获得结果的答案:

      $results = Result::where('enrolment_id', '=', $id)
        ->where('completed', '=', 1)
        ->with(['answers' => function($query) {
              $query->select('id', 'answer_plain');
        }])
        ->select(['id', 'enrolment_id', 'created_at'])
       ->get();
      

      现在您应该能够通过以下方式遍历结果和相关答案:

      foreach ($results as $result) {
        foreach ($result->answers as $answer) {
          var_dump($answer);
        }
      }
      

      你也可以替换:

      return response()->json($results);
      

      与 返回 $results;

      因为从控制器返回的所有 jsonable 内容都会在返回到浏览器之前自动序列化为 JSON。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2021-12-15
        相关资源
        最近更新 更多