Як встановити псевдонім таблиці в Laravel Eloquent-запитах (або за допомогою Query Builder)?


147

Скажімо, ми використовуємо конструктор запитів Laravel:

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

Я шукаю еквівалент цьому SQL:

really_long_table_name AS short_name

Це було б особливо корисно, коли мені доводиться вводити багато виділених елементів і (як правило, я також включаю псевдонім у псевдонім стовпця вибору, і він використовується в масиві результатів). Без будь-яких псевдонімів таблиць для мене набагато більше, і все стає набагато менш читабельним. Не можете знайти відповідь у документах Laravel, будь-яких ідеях?

Відповіді:


218

Laravel підтримує псевдоніми на таблицях і стовпцях з AS. Спробуйте

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

Давайте подивимось це в дії з приголомшливим tinkerінструментом

$ php майстер-майстер
[1]> Схема :: create ('дійсно_довго_таблиця_ім'я', функція ($ таблиця) {$ table-> з кроком ('id');});
// НУЛЬ
[2]> БД :: таблиця ('дійсно_довго_таблиця_імена') -> вставити (['id' => нуль]);
// правда
[3]> БД :: таблиця ('дійсно_довго_таблиця AS t') -> select ('t.id AS uid') -> get ();
// масив (
// 0 => об'єкт (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo Я знаю. Я вірю, що ви можете залишити коментар із запитом на форумах у laravel forums.laravel.io
peterm

2
@AldiUnanto Що з красномовним? Активний запис призначений для використання в одній таблиці, тому псевдоніми вам не потрібні. Коли ви використовуєте відносини, ви все одно працюєте з однією таблицею одночасно (тобто, коли ви визначаєте фільтри для відносин). Тепер, якщо ви використовуєте Query Builder з красномовною моделлю (тобто приєднання), тоді ви можете використовувати псевдоніми для всіх об'єднаних таблиць, але модель таблиці.
петерм

1
@peterm що робити, якщо я використовую красномовні програми для запитів? Я маю на увазі красномовну модель потрібно оголосити захищеною властивістю для імені таблиці (наприклад protected $table = "books";), то як я можу зробити псевдоніми? (Наприклад , генерований SQL: ... FROM books AS A ...)
Aldi Unanto

Ви можете зробити, protected $table = 'really_long_table_name AS short_name';але це не вдасться в INSERT. Також можуть порушуватись запити щодо відносин. Я використовую Lumen і DDD / шаблон сховища, щоб повністю уникнути красномовного.
програмамер

@peterm Я також затримався з красномовним псевдонімом. Ви щось знайшли з Красномовним?
Лізеш Шакя

77

Щоб використовувати псевдоніми в красномовних моделях, змініть код таким чином:

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

Це автоматично додасть префікс таблиці до імен таблиці та поверне примірник Itemsмоделі. не голий результат запиту. Додавання DB::rawне дозволяє laravel додавати префікси таблиці до псевдонімів.


1
@ m3rg Ви коли-небудь знаходили спосіб змусити його працювати з м'яким видаленням? запит не вдається з помилкоюUnknown column 'table_alias.deleted_at'
dev7

як щодо цієї ситуації? ВИБІРТЕ * ВІД fx_bank ЯК ПРАВИЛЬНИЙ З'ЄДНУЙТЕ fx_ex_keys AS b на b.bank_id = a.id І a.agent_type = 2, де b.status = 1 І b.group = -1;
GFxJamal

@jRhesk Використовуйте DB :: raw всюди для націлювання псевдонімів таблиці. інші методи Ларавеля використовуються як звичайні
AMIB

@ m3rg @ Yani я використовую це ->withTrashed()і->whereNull('table_alias.deleted_at')
Firman Hidayat

8

Ось як це можна зробити. Я наведу приклад з приєднанням, щоб це комусь стало супер зрозуміло.

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

Сподіваюся, це допомагає.


Чи можете ви навести приклад, коли псевдонім має пробіл замість підкреслення (_)?
Channox

7

Для використання в красномовному. Додайте поверх своєї моделі

protected $table = 'table_name as alias'

// Таблиця_назви повинна бути точною, як у вашій базі даних

..використовуйте у своєму запиті, як

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


1
Laravel красномовний дуже поганий дизайн, псевдонім, який ви визначаєте вище штрафу для оперативного запиту, але оновлення та видалення буде помилкою, оскільки ваш псевдонім.
Мір

1

Ви можете використовувати менше коду, записавши це:

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

І звичайно, якщо ви хочете вибрати більше полів, просто напишіть "," і додайте більше:

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

Це дуже практично, коли ви використовуєте об'єднаний запит


0

Так само, як відповідь AMIB, для помилки програмного видалення "Невідомий стовпець" table_alias.deleted_at "", просто додайте, ->withTrashed()а потім обробіть її самостійно як->whereRaw('items_alias.deleted_at IS NULL')

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.