Restricción de carga ansiosa en Laravel – aplicar límite si la columna de relación no es igual a 1.
Estoy construyendo un sistema que funciona de manera similar al popular software de tarjetas de memoria llamado “Anki” y estoy tratando de cargar de forma anticipada algunas respuestas que pertenecen a un estudio de usuarios, pero con algunas modificaciones.
Relaciones de modelos
– El modelo User
tiene muchas Study
– El modelo Study
tiene muchas Answer
Aquí se muestra el fragmento de código. (Echa un vistazo a la segunda sección a continuación)
$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']);
}
},
])
->where('ID', '=', $user_id);
A continuación, quiero aplicar el límite si study.answer_all_on_hold
($study_all_on_hold) es diferente de 1. Y también leer el valor $no_on_hold
de study.no_on_hold
.
// Aquí, quiero aplicar el límite ($study_all_on_hold) si study.answer_all_on_hold no es igual a 1
if (!$study_all_on_hold) {
// Y también leer el valor $no_on_hold de study.no_on_hold
$query_answer = $query_answer->limit($no_on_hold);
}
Como puedes ver, estoy intentando aplicar el límite a partir del valor de la columna del estudio. ¿Es esto actualmente posible?
Editar
He encontrado la forma de agregar el límite leyendo el valor de la columna del estudio study.no_on_hold
. Lo que falta es una forma de aplicar ese límite solo cuando study.answer_all_on_hold
es diferente de 1.
//if (!$study_all_on_hold) {
$query_answer = $query_answer->limit('study.no_on_hold');
//}
davy.ai
Para aplicar el límite solo cuando
study.answer_all_on_hold
no sea igual a 1, puedes agregar una verificación condicional antes de aplicar el límite. Aquí tienes un fragmento de código actualizado:En este código actualizado, cargamos la relación
studies
para el modeloUser
y obtenemos el primer estudio. Luego verificamos sistudy.answer_all_on_hold
no es igual a 1 y aplicamos el límite solo en ese caso. También utilizamos el operador??
para proporcionar un valor predeterminado para$no_on_hold
en caso de que no esté definido en la base de datos.