Дублирование результатов запроса после leftJoin
Уважаемое сообщество, здравствуйте!
В ходе работы над сниппетом, возвращающим список всех заказов пользователя, возникла проблема:
в результирующем массиве информация о заказе продублирована столько раз, сколько товаров включено в заказ.
Пожалуйста, подскажите, каким образом можно вернуть результат присоединения таблицы товаров к заказу в рамках одного элемента массива?
Ниже код моегокостыля сниппета (код, относящийся к оформлению результатов выборки вырезан, т.к. к вопросу не относится):
Спасибо!
В ходе работы над сниппетом, возвращающим список всех заказов пользователя, возникла проблема:
в результирующем массиве информация о заказе продублирована столько раз, сколько товаров включено в заказ.
Пожалуйста, подскажите, каким образом можно вернуть результат присоединения таблицы товаров к заказу в рамках одного элемента массива?
Ниже код моего
<?php
//
if(!isset($user) || ($user === 0)){
return '<p>Ошибка! Идентификатор пользователя не определён.</p>';
}
//Задаём значения чанков оформления по-умолчанию
if(!isset($tpl)){ $tpl = 'tpl.profile.orders_list.row'; }
if(!isset($tplWrapper) || ($tplWrapper === '')){ $tplWrapper = 'tpl.profile.orders_list.wrapper'; }
if(!isset($idx)){ $idx = 1; }
$q = $modx->newQuery('msOrder');
$q->select(
array
(
'msOrder.id',
'msOrder.num',
'msOrder.createdon',
'msOrder.cost',
'msOrder.status',
'op.product_id',
'op.name'
)
);
$q->where(array('msOrder.user_id' => $user));
$q->sortby('msOrder.id','DESC');
$q->leftJoin('msOrderProduct','op', 'msOrder.id = op.order_id');
$query = $q->prepare();
$query->execute();
$orders = $query->fetchAll(PDO::FETCH_ASSOC);
$res = print_r($orders,1);
echo '<div class="ord-lst-wrap"><pre>';
echo $res;
echo '</pre></div>';Ниже приведен результат работы сниппета, первые два пункта демонстрируют проблему (в заказе два товара):Array
(
[0] => Array
(
[id] => 9
[num] => 1511/6
[createdon] => 2015-11-17 09:43:21
[cost] => 17849.00
[status] => 1
[product_id] => 5553
[name] => Primavera (гостиная) Комод 1 /Глазово
)
[1] => Array
(
[id] => 9
[num] => 1511/6
[createdon] => 2015-11-17 09:43:21
[cost] => 17849.00
[status] => 1
[product_id] => 5205
[name] => Berlin 1 (гостиная) Шкаф МНЦ КОРПУС (01, Ясень шимо свентлый) /Глазово
)
[2] => Array
(
[id] => 8
[num] => 1511/5
[createdon] => 2015-11-15 09:00:35
[cost] => 7599.00
[status] => 1
[product_id] => 2034
[name] => (закрыт) Стенка Франк МА-190 Дуб кремона/Дуб феррара /Столлайн
)
[3] => Array
(
[id] => 7
[num] => 1511/4
[createdon] => 2015-11-10 03:09:59
[cost] => 26323.00
[status] => 1
[product_id] => 5788
[name] => Акцент орхидея Шкаф-купе 2300х1800х600/ясень шимо темный/шампань/Бумеранг
)P.S.: самое простое решение — вовсе избежать leftJoin'а таблицы товаров заказа к запросу, а в оформленном выводе возвращать ссылку с id-заказа, которая вела бы на страничку со сниппетом, принимающим на вход id заказа и возвращающего оформленный список товаров этого заказа. Но, может быть, это возможно сделать в одном сниппете (без обработки результирующего массива на php — объединения элементов с одинаковым id и формированием массива товаров)? Куда копать?Спасибо!
Комментарии: 3
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Если же нужно выбрать заказ + все его товары, то лучше не использовать leftJoin и добирать эти товары отдельным запросом во время оформления вывода заказа.
Ну а если нужно будет еще и сортировать по товарам, то тогда всё же оставляешь leftJoin и убираешь дубликаты уже во время оформления.
Так и поступаю: обрабатываю результаты выборки перед оформлением, сливая дубликаты в один элемент с массивом товаров.
Ниже приведен код сниппета и его чанков оформления.
Сниппет возвращает список заказов конкретного пользователя вместе с товарами заказа и оформляет вывод в чанки.
На вход сниппет принимает параметры:
'user' => Пользователь, чьи заказы выводим;
'tpl' => Чанк оформления элемента списка заказов;
'tplWrapper' => Чанк оформления оболочки списка заказов;
'tplProducts' => Чанк оформления элемента списка продуктов в заказе;
'tplEmpty' => Чанк оформления пустого результата;
Код сниппета «getUserOrders»:
Содержимое чанка 'tpl.profile.orders_list.wrapper':
Содержимое чанка 'tpl.profile.orders_list.row':
Содержимое чанка 'tpl.profile.orders_list.products.row':
Содержимое чанка 'tpl.profile.orders_list.empty':
Вызов сниппета на странице: