【发布时间】:2022-01-10 04:43:30
【问题描述】:
我正在构建一个与流行的名为“Anki”的抽认卡软件类似的系统,并且正在尝试加载一些属于用户研究的答案,但进行了一些修改。
模型关系
-
User有很多Study -
Study有很多Answer
这里是代码 sn-p。 (请看下面的第二部分)
$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'] );
}
下面,如果study.answer_all_on_hold ($study_all_on_hold) != 1,我想应用限制
并从study.no_on_hold读取$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.no_on_hold 中的列的值来了解如何添加限制。剩下的就是仅在 study.answer_all_on_hold 为 != 1 时应用该限制的方法
//if ( ! $study_all_on_hold ) {
$query_answer = $query_answer->limit( 'study.no_on_hold' );
// }
【问题讨论】:
-
可能不在单个查询中。不过,您绝对可以映射生成的集合以获得您想要的格式。
-
感谢您的建议,但我真的需要在应用所有这些条件的情况下急切地加载答案。我试过单独加载它,同时循环研究,但运行了很多查询,这就是为什么我对预先加载进行排序。
-
没有办法做到这一点,即使在原始 SQL 中也是如此。此外,您应该使用
when()方法查看条件查询子句,这将使您的代码更加简洁。
标签: laravel laravel-5 eloquent laravel-query-builder