我正在構建一個與流行的名為“Anki”的抽認卡軟體類似的系統,并試圖急切加載一些屬于用戶研究的答案,但做了一些修改。
模型關系
User有很多StudyStudy有很多Answer
這是代碼片段。(請看下面的第二部分)
$user_query = User::with([
'studies.answers' => function ( $query_answer ) use ( $args ) {
$query_answer
->where( 'grade', '=', 'hold' )
->groupBy( 'card_id' )
->orderByDesc( 'id' );
if ( $args['no_date_limit'] ) {
$query_answer = $query_answer->where( 'next_due_at', '>', $args['start_date'] );
} else {
$query_answer = $query_answer->whereBetween( 'next_due_at', [ $args['start_date'], $args['end_date'] ] );
}
if ( ! empty( $args['card_ids_in'] ) ) {
$query_answer = $query_answer->whereIn( 'card_id', $args['card_ids_in'] );
}
if ( ! empty( $args['card_ids_not_in'] ) ) {
$query_answer = $query_answer->whereNotIn( 'card_id', $args['card_ids_not_in'] );
}
下面,我想應用限制 if study.answer_all_on_hold ($study_all_on_hold) != 1 并且還$no_on_hold從study.no_on_hold
// Here, I want to apply the limit ($study_all_on_hold ) if study.answer_all_on_hold != 1
if ( ! $study_all_on_hold ) {
// And also read the $no_on_hold value from study.no_on_hold
$query_answer = $query_answer->limit( $no_on_hold );
}
},
])
->where( 'ID', '=', $user_id );
正如您所看到的,我正在嘗試應用研究列值的限制。這是目前可能的嗎?
編輯
我已經想出了如何通過從 study 讀取列的值來添加限制study.no_on_hold。剩下的是一種僅在study.answer_all_on_holdis != 1時應用該限制的方法
//if ( ! $study_all_on_hold ) {
$query_answer = $query_answer->limit( 'study.no_on_hold' );
// }
uj5u.com熱心網友回復:
在您的示例中,Eloquent 正在執行 3 個查詢:
SELECT * FROM users WHERE id = $user_idSELECT * FROM studies WHERE user_id IN (all users.id from query 1)SELECT * FROM answers WHERE study_id IN (all studies.id FROM query 2)
然后,它將所有結果分組到結果中Collection。LIMIT由于 Eloquent 的作業方式,您不能在查詢 3 上放置 a 。
我認為您可以通過應用一些收集方法來獲得您想要的結果。
$user_query = User::...get();
$user_query = $user_query->each(function ($user) {
$user->studies->transform(function ($study) {
if ($study->answer_all_on_hold != 1) {
$study->answers = $study->answers->take($study->no_on_hold)->values();
return $study;
} else {
return $study;
}
});
});
這不會改變查詢(因此您仍然會查詢每個答案),甚至會導致一些額外的開銷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/396817.html
標籤:拉拉维尔 laravel-5 雄辩 laravel 查询构建器
