es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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');
//}
Tags:  , , ,

Answer

  1. Avatar for 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:

    $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']);
            }
    
            // Aplicar el límite solo si study.answer_all_on_hold no es igual a 1
            $study = $query_answer->getRelation('getParent')->load('studies')->get('studies')->first();
            if ($study && $study->answer_all_on_hold != 1) {
                $no_on_hold = $study->no_on_hold ?? null;
                if ($no_on_hold) {
                    $query_answer = $query_answer->limit($no_on_hold);
                }
            }
        },
    ])
        ->where('ID', '=', $user_id);
    

    En este código actualizado, cargamos la relación studies para el modelo User y obtenemos el primer estudio. Luego verificamos si study.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.

Comments are closed.