Re: Выводит только 50 записей
Спасибо! А как я могу получить данные из таблицы order_address ведь leftjoin тут уже не поможет?
Форум ReadyScript Вопросы по разработке модулей и API системы Выводит только 50 записей
Спасибо! А как я могу получить данные из таблицы order_address ведь leftjoin тут уже не поможет?
Поможет. Их может быть сколько угодно ещё.
Посмотрел по внимательней и получилось казалось бы. Я делаю left join вот таким образом
->leftjoin(new \Shop\Model\Orm\Address(), 'A.user_id=C.user_id', 'C')
Вот целый запрос
$q = \RS\Orm\Request::make() //Формируем запрос
->from(new \Shop\Model\Orm\Order(), 'A')
->where(array('status' => '7'))
//->from(new \Shop\Model\Orm\Order())
->leftjoin(new \Users\Model\Orm\User(), 'A.user_id=B.id', 'B')
->leftjoin(new \Shop\Model\Orm\Address(), 'A.user_id=C.user_id', 'C')
->limit($limit);
Там у меня находится 4 заказа.
Но вот при таком сравнении
'A.user_id=C.user_id
Показывается 1104 записи, как это может быть связано?
Посмотрите, что в базе. Почитайте документацию к LEFT JOIN, добавьте группировку.
Получается следующее. Там находится 4 заказа, от незарегистрированного пользователя. user_id у них получается одинаковый. И когда я добавляю
->groupby('C.user_id')
то они группируются и получается на выводе один заказ, а как быть в таком случае?
когда вы используете LEFT JOIN, то в этом случае, если записей у присединяемой таблицы больше чем у записи к которой присодиняется эта таблица, то записи в выдачи дублируются со стороны первой таблицы и не дублируюся со стороны второй.
Вам надо либо группировать по id заказа. Либо догружать записи потом. Что конкретно Вы хотите получить из таблицы с адресами пользователя? Количество адресов? или их самих?
когда вы используете LEFT JOIN, то в этом случае, если записей у присединяемой таблицы больше чем у записи к которой присодиняется эта таблица, то записи в выдачи дублируются со стороны первой таблицы и не дублируюся со стороны второй.
Вам надо либо группировать по id заказа. Либо догружать записи потом. Что конкретно Вы хотите получить из таблицы с адресами пользователя? Количество адресов? или их самих?
Сами адреса
Тогда лучше догрузить из отдельным запросом потом. Либо если пользователей много. То из получившегося массива выдрать в отдельный массив. Далее сделать запрос к таблице адресов, где получить все адреса для нужных пользователей одним запрсом. Далее в получившемся массиве адресов пройтись по нему и собрать для заказов.
Ну например:
\RS\Orm\Request::make()
->from(new \Shop\Model\Orm\Address())
->whereIn('user_id', массив с id нужных пользователей)
->objects(null, 'user_id', true);
Запрос получит адреса объеденит по ключам user_id массив в подмассивы. Которые Вы можете использовать.
Скажите мне вот из этого массива, нужно получить массив с id нужных пользователей?
foreach($itemslist as $order){
/**
* @var \Shop\Model\Orm\Order $order
*/
//Здесь записываем сведения в какой нибудь промежуточный массив Например $order_data и плюсуем его в $orders_data
$order_data = array(
'order_num' => $order['order_num'],
'new_cost' => $order['new_cost'],
'userfields' => $order['userfields_arr'],
'user_phone' => $order['user_phone'],
'user_fio' => $order['user_fio'],
'id' => $order['id'],
'user_id' => $order['user_id'],
'phone' => $order['phone'],
'name' => $order['name'],
//и т.д.
);
$orders_data[] = $order_data;
}
Да
$user_ids = array();
foreach($itemslist as $order){
if (!in_array($order['user_id'], $user_ids)){ //Проверим если, ли уже в массиве такой id
$user_ids[] = $order['user_id'];
}
}
а это, как использовать это дальше?
var_dump($user_ids);
array(14) {
[0]=>
string(11) "-2147483648"
[1]=>
string(10) "-698880924"
[2]=>
string(4) "1156"
[3]=>
string(4) "2022"
[4]=>
string(4) "1130"
[5]=>
string(4) "1373"
[6]=>
string(4) "1741"
[7]=>
string(11) "-1327942436"
[8]=>
string(11) "-1007174388"
[9]=>
string(11) "-2097266773"
[10]=>
string(4) "1337"
[11]=>
string(4) "1776"
[12]=>
string(10) "-690740807"
[13]=>
string(11) "-1510144173"
}
Смотрите сообщение от 06.12.2016.
Далее в получившемся массиве адресов пройтись по нему и собрать для заказов.
верно?
вот это сделал, я выше не то указал.
Вто адреса получил, дальше то как их состыковать?
string(11) "-2147483648"
string(10) "-698880924"
string(4) "1156"
string(4) "2022"
string(4) "1130"
string(4) "1373"
string(4) "1741"
string(11) "-1327942436"
string(11) "-1007174388"
string(11) "-2097266773"
string(4) "1337"
string(4) "1776"
string(10) "-690740807"
string(11) "-1510144173"
Я здесь не вижу адресов, это id пользователей из Ваших заказов. Вам надо сделать запрос на получение адресов как я и писал ранее.
$addreses_by_users = \RS\Orm\Request::make()
->from(new \Shop\Model\Orm\Address())
->whereIn('user_id', массив с id нужных пользователей который Вы уже получили)
->objects(null, 'user_id', true);
Далее перебрать массив с заказами и состыковать полученные адреса.
Дак это все сделано же уже, как состыковать то их. Снова дуаеощшт делать?
Ну у Вас в массиве адресов все адреса распделены так, что у них есть общий ключ означающий id пользователя.
Соответственно, если перебрать массив заказов, где есть user_id, то из массива адресов адреса для конкретного пользователя можно достать по ключу пользователя. К примеру:
foreach($orders_data as &$order){
$order['addresses'] = $addreses_by_users[$order['user_id']];
}
Если Вы используете
$addreses_by_users = \RS\Orm\Request::make()
->from(new \Shop\Model\Orm\Address())
->whereIn('user_id', массив с id нужных пользователей который Вы уже получили)
->objects(null, 'user_id', true);
То в данном случае привяжется несколько адресов к одному пользователю. Попробуйте.
Вы меня не поняли немного. Там два заказа от разных пользователей, получается и адресов должно быть выведено, от каждого заказа свой адрес (т.е. 2 разных), а выводит только 1
Вот так это все выглядит
foreach($itemslist as $order){
/**
* @var \Shop\Model\Orm\Order $order
*/
//Здесь записываем сведения в какой нибудь промежуточный массив Например $order_data и плюсуем его в $orders_data
$order_data = array(
'order_num' => $order['order_num'],
'new_cost' => $order['new_cost'],
'userfields' => $order['userfields_arr'],
'user_phone' => $order['user_phone'],
'user_fio' => $order['user_fio'],
'id' => $order['id'],
'user_id' => $order['user_id'],
'phone' => $order['phone'],
'name' => $order['name'],
//и т.д.
);
$orders_data[] = $order_data;
}
$i++;
$offset += $limit;
$user_ids = array();
foreach($itemslist as $order){
if (!in_array($order['user_id'], $user_ids)){ //Проверим если, ли уже в массиве такой id
$user_ids[] = $order['user_id'];
}
}
$addreses_by_users = \RS\Orm\Request::make()
->from(new \Shop\Model\Orm\Address())
->whereIn('user_id', $user_ids)
->objects(null, 'user_id', true);
foreach($orders_data as $order){
$order['addresses'] = $addreses_by_users[$order['user_id']];
}
Вы забыли &
foreach($orders_data as &$order){
$order['addresses'] = $addreses_by_users[$order['user_id']];
}
И судя по Вашему коду у Вас как частичное получение заказов, так и остальные данные заключены в цикл, который догружает данные. А в цикле должен быть только код получающий заказы, а уже далее должно происходить и подгрузка пользователей и адресов.
Вы забыли &
По прежнему выводит один адресс.
И судя по Вашему коду у Вас как частичное получение заказов, так и остальные данные заключены в цикл, который догружает данные. А в цикле должен быть только код получающий заказы, а уже далее должно происходить и подгрузка пользователей и адресов.
если я выношу код, за пределы цикла, то получаю ошибку
Исключение - "SELECT * FROM `readylocal`.`tzte_order_address` WHERE `user_id` IN ()You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1"
$user_ids = array();
foreach($itemslist as $order){
if (!in_array($order['user_id'], $user_ids)){ //Проверим если, ли уже в массиве такой id
$user_ids[] = $order['user_id'];
}
}
$addreses_by_users = \RS\Orm\Request::make()
->from(new \Shop\Model\Orm\Address())
->whereIn('user_id', $user_ids)
->objects(null, 'user_id', true);
foreach($orders_data as &$order){
$order['addresses'] = $addreses_by_users[$order['user_id']];
}
var_dump($addreses_by_users[$order['user_id']]);
Вынесите за пределы цикла и смотрите что у Вас в $itemslist. Проследите что происходит $user_ids
Вынес вот это за пределы цикла
$user_ids = array();
foreach($itemslist as $order){
if (!in_array($order['user_id'], $user_ids)){ //Проверим если, ли уже в массиве такой id
$user_ids[] = $order['user_id'];
}
}
$addreses_by_users = \RS\Orm\Request::make()
->from(new \Shop\Model\Orm\Address())
->whereIn('user_id', $user_ids)
->objects(null, 'user_id', true);
foreach($orders_data as &$order){
$order['addresses'] = $addreses_by_users[$order['user_id']];
}
после всего этого вставляю var_dump($user_ids); получаю array(0) { } и var_dump($itemslist); получаю array(0) { }
Форум ReadyScript Вопросы по разработке модулей и API системы Выводит только 50 записей