No Laravel, é comum definir a tabela correspondente de um modelo usando a propriedade table, como:
class User extends Model { protected $table = 'users'; }
No entanto, em vez de mapear diretamente para uma tabela, podemos usar uma subconsulta. Essa técnica nos permite encapsular consultas complexas na camada de aplicação, de forma semelhante à criação de uma visualização de banco de dados, mas com a flexibilidade adicional das operações do Eloquent.
Por exemplo, considere uma tabela de usuários que armazena informações sobre administradores e usuários regulares. Podemos criar um modelo AdminUser usando uma 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 extrai dados de uma subconsulta (selecione id, nome dos usuários onde admin_user = 1), permitindo que você os consulte como um modelo padrão:
AdminUser::query()->get();
ou
AdminUser::query()->first();
No entanto, esteja ciente de que certas consultas, como find(1), não funcionarão diretamente:
AdminUser::query()->find(1);
Para contornar isso, você pode usar uma condição where combinada com first():
AdminUser::query()->where('id', 1)->first();
O exemplo fornecido é uma ilustração direta de como podemos estruturar a lógica dentro de um modelo. No entanto, esta abordagem pode ser dimensionada e adaptada para acomodar cenários muito mais complexos. Ao aproveitar essas estruturas, podemos gerenciar e extrair com eficiência lógica complexa, garantindo que nossos modelos permaneçam organizados, sustentáveis e escaláveis à medida que crescem em complexidade.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3