Como alias uma tabela nas consultas do Laravel Eloquent (ou usando o Query Builder)?


147

Digamos que estamos usando o construtor de consultas do Laravel:

$users = DB::table('really_long_table_name')
           ->select('really_long_table_name.id')
           ->get();

Estou procurando um equivalente a este SQL:

really_long_table_name AS short_name

Isso seria especialmente útil quando eu tiver que digitar muitas seleções e wherees (ou normalmente incluir o alias no alias da coluna do select também, e ele será usado na matriz de resultados). Sem nenhum apelido de tabela, há muito mais digitação para mim e tudo se torna muito menos legível. Não consegue encontrar a resposta nos documentos do laravel, tem alguma idéia?

Respostas:


218

O Laravel suporta aliases em tabelas e colunas com AS. Experimentar

$users = DB::table('really_long_table_name AS t')
           ->select('t.id AS uid')
           ->get();

Vamos vê-lo em ação com uma tinkerferramenta incrível

$ php funileiro artesão
[1]> Schema :: create ('really_long_table_name', função ($ table) {$ table-> incrementos ('id');});
// NULO
[2]> DB :: table ('really_long_table_name') -> insert (['id' => null]);
// verdade
[3]> DB :: table ('nome_do_tabela_realmente longo AS t') -> select ('t.id AS uid') -> get ();
// array (
// 0 => objeto (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo I know. Eu acredito que você pode deixar um comentário com o pedido em fóruns laravel forums.laravel.io
peterm

2
@AldiUnanto E a Eloquent? O registro ativo deve ser usado em uma tabela, portanto, você não precisa de aliases. Quando você usa relações, ainda está lidando com uma tabela de cada vez (por exemplo, quando define filtros no relacionamento). Agora, se você estiver usando o Query Builder com um modelo Eloquent (ou seja, junção), poderá usar aliases em todas as tabelas unidas, mas na tabela de modelos.
Peterm

1
@ Peter e se eu usar o construtor de consultas no eloquente? Quero dizer que o modelo eloquente precisa declarar uma propriedade protegida para o nome da tabela (por exemplo protected $table = "books";), então como posso criar um alias? SQL (por exemplo, gerado: ... FROM books AS A ...)
Aldi Unanto

Você poderia fazer, protected $table = 'really_long_table_name AS short_name';mas isso falharia nos INSERTs. Também pode interromper as consultas de relacionamento. Estou usando o Lumen e um padrão DDD / Repository para evitar o Eloquent completamente.
prograhammer

@ Peter Também estou preso ao alias Eloquent. Você encontrou algo com Eloquent?
Lizesh Shakya

77

Para usar aliases em modelos eloquentes, modifique seu código assim:

Item
    ::from( 'items as items_alias' )
    ->join( 'attachments as att', DB::raw( 'att.item_id' ), '=', DB::raw( 'items_alias.id' ) )
    ->select( DB::raw( 'items_alias.*' ) )
    ->get();

Isso adicionará automaticamente o prefixo da tabela aos nomes da tabela e retornará uma instância do Itemsmodelo. não é um resultado de consulta simples. A adição DB::rawevita que o laravel adicione prefixos de tabela a aliases.


1
@ m3rg você já encontrou uma maneira de fazê-lo funcionar com exclusão suave? consulta falha com erroUnknown column 'table_alias.deleted_at'
dev7 29/11

e essa situação? SELECT * FROM fx_bank como uma associação externa correta fx_ex_keys AS b em b.bank_id = a.id AND a.agent_type = 2 ONDE b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk Use DB :: raw em todos os lugares para segmentar aliases da tabela. outros métodos Laravel são usados como normal
AMIB

@ m3rg @Yani eu uso isso ->withTrashed()e->whereNull('table_alias.deleted_at')
Firman Hidayat

8

Aqui está como alguém pode fazer isso. Vou dar um exemplo de união para que fique super claro para alguém.

$products = DB::table('products AS pr')
        ->leftJoin('product_families AS pf', 'pf.id', '=', 'pr.product_family_id')
        ->select('pr.id as id', 'pf.name as product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

Espero que isto ajude.


Você pode fornecer um exemplo em que o alias possui espaço em branco em vez de sublinhado (_)?
Channox 29/08/19

7

Para usar no Eloquent. Adicione em cima do seu modelo

protected $table = 'table_name as alias'

// nome_tabela deve ser exato como no seu banco de dados

..Então use em sua consulta como

ModelName::query()->select(alias.id, alias.name)


1
Design muito eloquente e muito ruim do Laravel, alias que você define acima para multa para consulta de operação, mas atualizar e excluir ocorrerão erros por causa do seu alias.
Meas

1

Você pode usar menos código, escrevendo o seguinte:

    $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name'));

E, claro, se você quiser selecionar mais campos, basta escrever um "," e adicionar mais:

 $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name', 'really_long_table_name.another_field as other', 'and_another'));

Isso é muito prático quando você usa uma consulta complexa de junções


0

O mesmo que a resposta AMIB, para o erro de exclusão suave "Coluna desconhecida 'table_alias.deleted_at'", basta adicionar ->withTrashed()e manipular você como->whereRaw('items_alias.deleted_at IS NULL')

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.