Laravel约束热切加载-如果关系列,则应用限制!=1



Am正在构建一个类似于流行的闪卡软件";Anki";我正试图加载一些属于用户研究的答案,但有一些修改。

模型关系

  • User有许多Study
  • Study有许多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'] );
}

下面,如果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' );
//  }

在您的示例中,Eloquent正在执行3个查询:

  1. SELECT * FROM users WHERE id = $user_id
  2. SELECT * FROM studies WHERE user_id IN (all users.id from query 1)
  3. SELECT * FROM answers WHERE study_id IN (all studies.id FROM query 2)

然后,它将所有结果分组到生成的Collection中。由于Eloquent的工作方式,您不能在查询3上放置LIMIT

我认为你可以通过应用一些收集方法来获得你想要的结果。

$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;
}
});
});

这不会改变查询(所以您仍然会查询每个答案(,甚至会导致一些额外的开销。

最新更新