Как псевдоним таблицы в Laravel Eloquent queries (или с помощью построителя запросов)?



допустим, мы используем конструктор запросов Laravel:



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


Я ищу эквивалент этого SQL:



really_long_table_name AS short_name


Это было бы особенно полезно, когда мне нужно ввести много selects и wheres (или обычно я включаю псевдоним в псевдоним столбца select, а также, и он используется в массиве результатов). Без каких-либо псевдонимов таблиц для меня гораздо больше набирается, и все становится намного менее читаемым. Не могу найти ответ в laravel доктора, есть идеи?

974   5  

5 ответов:

Laravel поддерживает псевдонимы таблиц и столбцов с помощью AS. Попробуй

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

давайте посмотрим его в действии с удивительным tinker инструмент

$ php artisan tinker
[1] > Schema::create('really_long_table_name', function($table) {$table->increments('id');});
// NULL
[2] > DB::table('really_long_table_name')->insert(['id' => null]);
// true
[3] > DB::table('really_long_table_name AS t')->select('t.id AS uid')->get();
// array(
//   0 => object(stdClass)(
//     'uid' => '1'
//   )
// )

чтобы использовать псевдонимы на красноречивых моделях, измените свой код следующим образом:

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.

вот как это можно сделать. Я приведу пример с присоединением так, что это становится супер ясно кому-то.

$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 family_name', 'pf.id as family')
        ->orderBy('pr.id', 'desc')
        ->get();

надеюсь, что это помогает.

использовать в красноречивом. Добавить поверх вашей модели

protected $table = 'table_name as alias'

/ / table_name должно быть точным, как в вашей базе данных

..затем используйте в своем запросе как

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

то же, что и ответ AMIB, для мягкого удаления ошибки "неизвестный столбец" table_alias.deleted_at'", просто добавьте ->withTrashed() тогда разберись сам, как ->whereRaw('items_alias.deleted_at IS NULL')

Comments

    Ничего не найдено.