[英]How can I limit selected columns from an eloquent relationship?
我有一個3項的概念都存儲在一個數據庫中,並在它們之間定義了關系。 這些項目反映了調查的答案。 表格是:
結果:id,enrolment_id,assessment_id,completed(int),timestamps result_answers:id,result_id,answer_id,timestamps answers:id,answer_plain,answer_html,timestamps
我正在嘗試構建一個包含以下內容的對象:
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()
with()
但沒有運氣。
任何幫助贊賞。
結果與答案之間存在多對多關系,您不應該關心中間的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。
您可以將get()
中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'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.