Как псевдоним таблицы в 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 доктора, есть идеи?
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