Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 29.04.2017 18:58:12

Как задать алиас для таблицы

Подскажите,
как в  laravel 5.4 задать алиас для таблицы чтобы потом его использовать в ->select? Делаю:

		$quoteModel->from( ' category as '.\DB::raw('cat') );
	...
		$quoteModel->select(  \DB::raw('cat.name ')  );
		$categoriesList= $quoteModel->paginate($items_per_page);

И получаю ошибку :

select cat.name from "pd_category" as "pd_cat" order by "name" asc limit 20 offset 0

pd_ - это префикс в настройках. Если не использовать Raw -то также ошибка.

синтаксис без raw нормально работает если работать с таблицами

DB::table('category AS cat')  ->select('cat.name AS cat_name')     ->get();

Но при работе с моделями ошибка ...


Спасибо!

Не в сети

#2 30.04.2017 14:35:19

Re: Как задать алиас для таблицы

Поковырявшись, удалось запустить так(у меня там небольшой конструктор - так как в зависимости от входных параметров могут меняться параметры запроса):

		$category_table_name= with(new Category)->getTableName();
		$quoteModel= Category::from(  \DB::raw(DB::getTablePrefix().$category_table_name.' as cat' ));

		$additive_fields_for_select= "";
		$fields_for_select= 'cat.*';

		$product_category_table_name= DB::getTablePrefix().'product_category';
		if ( !empty($filtersArray['show_products_count']) ) {
			$additive_fields_for_select .= ', ( select count(*) from ' . $product_category_table_name . ' as pc where pc.category_id = ' . 'cat.id ) as category_products_count';
		}

		$fields_for_select.= ' ' . $additive_fields_for_select;
		$quoteModel->select( \DB::raw($fields_for_select) );
		$categoriesList= $quoteModel->paginate($items_per_page);

И генерит такой sql:

select cat.* , ( select count(*) from pd_product_category as pc where pc.category_id = cat.id ) as category_products_count from pd_category as cat order by "name" asc limit 20 offset 0

Не в сети

#3 01.05.2017 10:29:24

Re: Как задать алиас для таблицы

лучше добавить поле счётчика в pd_category. mysql конечно оптимизирует 20 вложенных запросов в один джойн, но всё равно выборка получается не очень легковесная (особенно если индекс в pd_product_category не используется при выборках по pd_product_category.category_id). в девелопменте будет конечно летать, но в продакшене с ростом количества категорий и товаров и при большой посещаемости начнёт нагружать сервер

естественно, тут надо смотреть как это потом будет работать. для инет-магазина с 20 товарами и 100 посетителями в день такие оптимизации не имеют смысла

Не в сети

Подвал раздела