En Laravel, es común definir la tabla correspondiente a un modelo usando la propiedad table, como por ejemplo:
class User extends Model { protected $table = 'users'; }
Sin embargo, en lugar de asignar directamente a una tabla, podemos usar una subconsulta. Esta técnica nos permite encapsular consultas complejas dentro de la capa de aplicación, de manera muy similar a crear una vista de base de datos, pero con la flexibilidad adicional de las operaciones de Eloquent.
Por ejemplo, considere una tabla de usuarios que almacena información sobre administradores y usuarios habituales. Podemos crear un modelo AdminUser usando una subconsulta:
class AdminUser { public function getTable(): string|\Illuminate\Contracts\Database\Query\Expression { $sql = User::query() ->select('id', 'name') ->where('admin_user', true) ->toRawSql(); return DB::raw(sprintf('(%s) as admin_users', $sql)); } }
Este modelo extrae datos de una subconsulta (seleccione ID, nombre de los usuarios donde admin_user = 1), lo que le permite consultarlo como un modelo estándar:
AdminUser::query()->get();
o
AdminUser::query()->first();
Sin embargo, tenga en cuenta que ciertas consultas, como buscar(1), no funcionarán directamente:
AdminUser::query()->find(1);
Para solucionar este problema, puede utilizar una condición donde combinada con first():
AdminUser::query()->where('id', 1)->first();
El ejemplo proporcionado es una ilustración sencilla de cómo podemos estructurar la lógica dentro de un modelo. Sin embargo, este enfoque puede ampliarse y adaptarse para adaptarse a escenarios mucho más complejos. Al aprovechar dichas estructuras, podemos administrar y extraer de manera eficiente una lógica compleja, asegurando que nuestros modelos permanezcan organizados, mantenibles y escalables a medida que crecen en complejidad.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3