Laravel Eloquent sorgularında (veya Query Builder'ı kullanarak) bir tablo nasıl takma adlanır?


147

Diyelim ki Laravel'in sorgu oluşturucusunu kullanıyoruz:

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

Bu SQL eşdeğer bir arıyorum:

really_long_table_name AS short_name

Bu, özellikle çok sayıda seçim ve nereye yazmam gerektiğinde yararlı olacaktır (veya tipik olarak, diğer adı da seçimin sütun takma adına dahil ettim ve sonuç dizisinde kullanıldı). Herhangi bir tablo takma adı olmadan benim için çok daha fazla yazım var ve her şey daha az okunabilir hale geliyor. Yanıtı laravel belgelerinde bulamadınız mı?

Yanıtlar:


218

Laravel, tablo ve sütunlardaki takma adları destekler AS. Deneyin

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

Harika bir tinkeraraçla iş başında görelim

$ php zanaatkar tamircilik
[1]> Schema :: create ('really_long_table_name', işlev ($ table) {$ table-> increments ('id');});
// BOŞ
[2]> DB :: tablosu ('really_long_table_name') -> insert (['id' => null]);
// doğru
[3]> DB :: tablosu ('really_long_table_name AS t') -> seçin ('t.id AS uid') -> get ();
// dizi(
// 0 => nesne (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo biliyorum. Sana laravel forumlarda isteğiyle bir yorum bırakabilirsiniz inanıyoruz forums.laravel.io
PeterM

2
@AldiUnanto Eloquent ne olacak? Aktif kayıt tek bir tabloda kullanılması gerektiği için takma adlara ihtiyacınız yoktur. İlişkileri kullandığınızda, hala bir seferde bir tabloyla uğraşıyorsunuz (yani, ilişki üzerinde filtreler tanımladığınızda). Şimdi Sorgu Oluşturucu'yu bir Eloquent modeliyle (yani birleştirme) kullanıyorsanız, birleştirilen tüm tablolarda, ancak model tablosunda takma adları kullanabilirsiniz.
peterm

1
@peterm eloquent'te sorgu oluşturucu kullanırsam ne olur? Demek istediğim, eloquent modelin tablo adı için korumalı bir özellik bildirmesi gerekiyor (örn. protected $table = "books";) O zaman nasıl takma ad yapabilirim? (örneğin oluşturulan sql: ... FROM books AS A ...)
Aldi Unanto

Yapabilirsiniz protected $table = 'really_long_table_name AS short_name';ama bu INSERTs başarısız olur. Ayrıca ilişki sorgularını bozabilir. Eloquent'ı tamamen önlemek için Lumen ve DDD / Depo deseni kullanıyorum.
prograhammer

@peterm Ayrıca Eloquent takma adla takılı kaldım. Eloquent ile bir şey buldunuz mu?
Lizesh Shakya

77

Etkili modellerde takma adları kullanmak için kodunuzu şu şekilde değiştirin:

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

Bu, tablo adlarına otomatik olarak tablo öneki ekler ve Itemsmodelin bir örneğini döndürür . çıplak sorgu sonucu değil. Ekleme, DB::rawlaravel'in takma adlara tablo önekleri eklemesini önler.


1
@ m3rg Hiç yumuşak silme ile çalışmanın bir yolunu buldunuz mu? sorgu hatası ile başarısız oluyorUnknown column 'table_alias.deleted_at'
dev7

bu duruma ne dersin? SELECT * DOĞRU BİR DIŞ GİRİŞ OLARAK fx_bank'tan fx_ex_keys b.bank_id = a.id ve a.agent_type = 2 NEREDE b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk Tablo diğer adlarını hedeflemek için DB :: raw ürününü kullanın. diğer Laravel yöntemleri normal olarak kullanılır
AMIB

@ m3rg @Yani bunu kullanıyorum ->withTrashed()ve->whereNull('table_alias.deleted_at')
Firman Hidayat

8

İşte bunu nasıl yapabilirsiniz. Birine süper netleşmesi için katılarak bir örnek vereceğim.

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

Bu yardımcı olur umarım.


Diğer adın alt çizgi (_) yerine boşluk olduğu bir örnek verebilir misiniz?
Channox

7

Eloquent'de kullanmak için. Modelinizin üstüne ekleyin

protected $table = 'table_name as alias'

// tablo_adı veritabanınızdaki gibi olmalıdır

..şimdi sorgunuzda olduğu gibi kullanın

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


1
Laravel eloquent çok kötü tasarım, operasyon sorgusu için yukarıda tanımladığınız takma ad, ancak güncelleme ve silme takma adınız nedeniyle hata verecektir.
Ölçüm

1

Bunu yazarak daha az kod kullanabilirsiniz:

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

Ve elbette daha fazla alan seçmek istiyorsanız, bir "," yazıp daha fazlasını ekleyin:

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

Birleştirme karmaşık sorgusu kullandığınızda bu çok pratik


0

AMIB cevabı ile aynı, "Bilinmeyen sütun 'table_alias.deleted_at'" yumuşak silme hatası için, sadece ekleyin ->withTrashed()ve kendiniz gibi işleyin->whereRaw('items_alias.deleted_at IS NULL')

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.