Bagaimana cara alias tabel dalam kueri Laravel Eloquent (atau menggunakan Pembuat Kueri)?

147

Katakanlah kita menggunakan pembuat permintaan Laravel:

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

Saya mencari yang setara dengan SQL ini:

really_long_table_name AS short_name

Ini akan sangat membantu ketika saya harus mengetik banyak pilihan dan wheres (atau biasanya saya menyertakan alias di kolom alias pilih juga, dan itu sudah digunakan dalam array hasil). Tanpa alias tabel apa pun, ada lebih banyak pengetikan untuk saya dan semuanya menjadi jauh lebih mudah dibaca. Tidak dapat menemukan jawabannya di dokumen laravel, ada ide?

prograhammer
sumber

Jawaban:

218

Laravel mendukung alias pada tabel dan kolom dengan AS. Mencoba

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

Mari kita melihatnya beraksi dengan tinkeralat yang luar biasa

penggerutu $ php artisan
[1]> Skema :: create ('really_long_table_name', function ($ table) {$ table-> increments ('id');});
// NULL
[2]> DB :: table ('really_long_table_name') -> masukkan (['id' => null]);
// benar
[3]> DB :: table ('really_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// Himpunan(
// 0 => objek (stdClass) (
// 'uid' => '1'
//)
//)
peterm
sumber
2
@ RubensMariuzzo saya tahu. Saya percaya Anda dapat meninggalkan komentar dengan permintaan di forum laravel forums.laravel.io
peterm
2
@AldiUnanto Bagaimana dengan Eloquent? Rekaman aktif dimaksudkan untuk digunakan pada satu tabel karena itu Anda tidak perlu alias. Saat Anda menggunakan relasi Anda masih berurusan dengan satu tabel pada satu waktu (yaitu ketika Anda mendefinisikan filter pada hubungan). Sekarang jika Anda menggunakan Query Builder dengan model Eloquent (yaitu bergabung) maka Anda dapat menggunakan alias pada semua tabel yang bergabung, tetapi tabel model.
peterm
1
@peterm bagaimana jika saya menggunakan pembuat kueri dengan fasih? Maksud saya model fasih perlu mendeklarasikan properti yang dilindungi untuk nama tabel (misalnya protected $table = "books";) lalu bagaimana saya bisa membuat alias? (misalnya dihasilkan sql: ... FROM books AS A ...)
Aldi Unanto
Anda dapat melakukan protected $table = 'really_long_table_name AS short_name';tetapi itu gagal pada INSERT. Juga dapat memecah kueri hubungan. Saya menggunakan Lumen dan pola DDD / Repositori untuk menghindari Eloquent sepenuhnya.
prograhammer
@peterm Saya juga terjebak dengan alias Eloquent. Apakah Anda menemukan sesuatu dengan Eloquent?
Lizesh Shakya
77

Untuk menggunakan alias pada model yang fasih, modifikasi kode Anda seperti ini:

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

Ini secara otomatis akan menambahkan awalan tabel ke nama tabel dan mengembalikan instance Itemsmodel. bukan hasil kueri kosong. Menambahkan DB::rawmencegah laravel dari menambahkan awalan tabel ke alias.

AMIB
sumber
1
@ m3rg apakah Anda pernah menemukan cara untuk membuatnya berfungsi dengan hapus lunak? kueri gagal dengan kesalahanUnknown column 'table_alias.deleted_at'
dev7
bagaimana dengan situasi ini? PILIH * DARI fx_bank SEBAGAI OUTER YANG TEPAT BERGABUNG fx_ex_keys AS b pada b.bank_id = a.id DAN a.agent_type = 2 WHERE b.status = 1 DAN b.group = -1;
GFxJamal
@ jRhesk Gunakan DB :: raw di mana-mana untuk menargetkan alias tabel. Metode Laravel lainnya digunakan seperti biasa
AMIB
@ m3rg @ Yani saya menggunakan ini ->withTrashed()dan->whereNull('table_alias.deleted_at')
Firman Hidayat
8

Inilah cara seseorang dapat melakukannya. Saya akan memberikan contoh dengan bergabung sehingga menjadi sangat jelas bagi seseorang.

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

Semoga ini membantu.

Koushik Das
sumber
Bisakah Anda memberikan contoh di mana alias memiliki spasi alih-alih garis bawah (_)?
Channox
7

Untuk digunakan dalam Eloquent. Tambahkan di atas model Anda

protected $table = 'table_name as alias'

// table_name harus sama persis dengan di basis data Anda

..kemudian gunakan dalam permintaan Anda seperti

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

muinh
sumber
1
Laravel desain yang sangat buruk, alias Anda tentukan di atas baik untuk permintaan operasi, tetapi perbarui dan hapus akan kesalahan karena alias Anda.
Ukur
1

Anda dapat menggunakan lebih sedikit kode, menulis ini:

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

Dan tentu saja jika Anda ingin memilih lebih banyak bidang, cukup tulis "," dan tambahkan lagi:

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

Ini sangat praktis ketika Anda menggunakan permintaan yang tergabung kompleks

Carlos h Gonzalez
sumber
0

Sama seperti jawaban AMIB, untuk kesalahan hapus lunak "Kolom tidak dikenal 'table_alias.deleted_at'", tambahkan saja ->withTrashed()lalu tangani sendiri seperti->whereRaw('items_alias.deleted_at IS NULL')

Ahmed Gamal
sumber