¿Cómo alias una tabla en consultas Laravel Eloquent (o usando Query Builder)?

147

Digamos que estamos usando el generador de consultas de Laravel:

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

Estoy buscando un equivalente a este SQL:

really_long_table_name AS short_name

Esto sería especialmente útil cuando tengo que escribir muchas selecciones y dónde (o típicamente incluyo el alias en el alias de columna de la selección, y se usa en la matriz de resultados). Sin alias de tabla, hay mucho más tipeo para mí y todo se vuelve mucho menos legible. ¿No puede encontrar la respuesta en los documentos de laravel, alguna idea?

martillo programador
fuente

Respuestas:

218

Laravel admite alias en tablas y columnas con AS. Tratar

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

Vamos a verlo en acción con una tinkerherramienta increíble.

$ php tinker artesanal
[1]> Schema :: create ('really_long_table_name', function ($ table) {$ table-> increments ('id');});
// NULO
[2]> DB :: table ('really_long_table_name') -> insert (['id' => null]);
// cierto
[3]> DB :: table ('really_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// array (
// 0 => objeto (stdClass) (
// 'uid' => '1'
//)
//)
peterm
fuente
2
@RubensMariuzzo lo sé. Creo que puede dejar un comentario con solicitud en laravel foros forums.laravel.io
peterm
2
@AldiUnanto ¿Qué pasa con Eloquent? Registro activo destinado a ser utilizado en una tabla, por lo tanto, no necesita alias. Cuando usa relaciones, todavía está tratando con una tabla a la vez (es decir, cuando define filtros en la relación). Ahora, si está utilizando el Generador de consultas con un modelo Eloquent (es decir, unirse), puede usar alias en todas las tablas unidas, pero en la tabla de modelos.
Peter
1
@peterm ¿y si uso el generador de consultas en elocuente? Quiero decir, el modelo elocuente necesita declarar una propiedad protegida para el nombre de la tabla (por ejemplo protected $table = "books";), ¿cómo puedo crear un alias? (por ejemplo, sql generado ... FROM books AS A ...) :
Aldi Unanto
Sin embargo, podría hacerlo, protected $table = 'really_long_table_name AS short_name';pero eso fallaría en INSERT. También puede romper consultas de relación. Estoy usando Lumen y un patrón DDD / Repository para evitar Eloquent por completo.
prograhammer
@peterm También estoy atrapado con el alias Eloquent. ¿Encontraste algo con Eloquent?
Lizesh Shakya
77

Para usar alias en modelos elocuentes, modifique su código de esta manera:

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();

Esto agregará automáticamente el prefijo de tabla a los nombres de tabla y devolverá una instancia de Itemsmodelo. No es un resultado de consulta simple. Agregar DB::rawevita que laravel agregue prefijos de tabla a los alias.

AMIB
fuente
1
@ m3rg ¿alguna vez has encontrado una manera de hacerlo funcionar con la eliminación suave? la consulta falla con errorUnknown column 'table_alias.deleted_at'
dev7
¿Qué tal esta situación? SELECCIONE * DESDE fx_bank COMO a EXTERIOR DERECHO ÚNASE a fx_ex_keys AS b en b.bank_id = a.id AND a.agent_type = 2 DONDE b.status = 1 AND b.group = -1;
GFxJamal
@jRhesk Use DB :: raw en todas partes para seleccionar alias de tabla. otros métodos de Laravel se usan normalmente
AMIB
@ m3rg @ Yani uso esto ->withTrashed()y->whereNull('table_alias.deleted_at')
Firman Hidayat
8

Así es como uno puede hacerlo. Daré un ejemplo al unirme para que quede súper claro para alguien.

$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 esto ayude.

Koushik Das
fuente
¿Puede proporcionar un ejemplo en el que el alias tenga espacios en blanco en lugar de guión bajo (_)?
Channox
7

Para usar en Eloquent. Agregue encima de su modelo

protected $table = 'table_name as alias'

// nombre_tabla debe ser exacto como en su base de datos

..entonces use en su consulta como

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

muinh
fuente
1
Diseño elocuente muy pobre de Laravel, el alias que define arriba está bien para la consulta de operación, pero actualizar y eliminar producirá un error debido a su alias.
Medida
1

Puede usar menos código, escribiendo esto:

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

Y, por supuesto, si desea seleccionar más campos, simplemente escriba un "," y agregue más:

 $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'));

Esto es muy práctico cuando utiliza una consulta compleja de combinaciones

Carlos h Gonzalez
fuente
0

Igual que la respuesta AMIB, para el error de borrado suave "Columna desconocida 'table_alias.deleted_at'", simplemente agregue y ->withTrashed()luego maneje usted mismo como->whereRaw('items_alias.deleted_at IS NULL')

Ahmed Gamal
fuente