Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Подскажите,
как в 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();
Но при работе с моделями ошибка ...
Спасибо!
Не в сети
Поковырявшись, удалось запустить так(у меня там небольшой конструктор - так как в зависимости от входных параметров могут меняться параметры запроса):
$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
Не в сети
лучше добавить поле счётчика в pd_category. mysql конечно оптимизирует 20 вложенных запросов в один джойн, но всё равно выборка получается не очень легковесная (особенно если индекс в pd_product_category не используется при выборках по pd_product_category.category_id). в девелопменте будет конечно летать, но в продакшене с ростом количества категорий и товаров и при большой посещаемости начнёт нагружать сервер
естественно, тут надо смотреть как это потом будет работать. для инет-магазина с 20 товарами и 100 посетителями в день такие оптимизации не имеют смысла
Не в сети
Страницы 1