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.

¿Cómo construir una consulta para múltiples condiciones para la misma columna en el constructor de consultas de Laravel?

Quiero obtener el recuento de la tabla “usuario” con la columna “plan_validity” que es nula o posterior a la fecha actual. Ambas condiciones deben verificarse para la misma columna con “user_id” y “status = 1”.

$currentUser = User::where('user_id', $card_details->user_id)
                ->where('status', 1)
                ->where(function (Builder $query) {
                    return $query
                        ->whereDate('plan_validity', '>=', Carbon::now())
                        ->orWhere('plan_validity', null);
                    })->count();

Esto da un error:

[2021-11-23 10:40:31] production.ERROR: Argument 1 passed to App\Http\Controllers\ProfileController::App\Http\Controllers\{closure}() must be an instance of App\Http\Controllers\Builder, instance of Illuminate\Database\Eloquent\Builder given, called in /home/hellovcard/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php on line 237 {"userId":17,"exception":"[object] (TypeError(code: 0): Argument 1 passed to App\\Http\\Controllers\\ProfileController::App\\Http\\Controllers\\{closure}() must be an instance of App\\Http\\Controllers\\Builder, instance of Illuminate\\Database\\Eloquent\\Builder given, called in /home/hellovcard/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php on line 237 at /home/hellovcard/public_html/app/Http/Controllers/ProfileController.php:34)

¿Cómo se puede modificar la consulta mencionada anteriormente?

Este es el resultado que necesito obtener.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que hay un problema con el uso de la clase “Builder”. Parece que el cierre utilizado en el método “where” espera la clase “Builder” del espacio de nombres “App\Http\Controllers”, en lugar de la clase “Illuminate\Database\Eloquent\Builder”.

    Para solucionar este problema, podemos importar la clase “Builder” del espacio de nombres correspondiente utilizando la instrucción “use”. Aquí está una versión actualizada de la consulta que debería funcionar:

    use Illuminate\Database\Query\Builder as QueryBuilder; // importar la clase Builder
    
    // ...
    
    $currentUser = User::where('user_id', $card_details->user_id)
                    ->where('status', 1)
                    ->where(function (QueryBuilder $query) {
                        return $query
                            ->whereDate('plan_validity', '>=', now())
                            ->orWhereNull('plan_validity');
                        })
                    ->count();
    

    En esta versión, hemos importado la clase “QueryBuilder” utilizando la instrucción “use” y especificado el espacio de nombres en el parámetro del cierre. También hemos utilizado el método “orWhereNull” para simplificar la comprobación de nulos.

Comments are closed.