26

Re: Выводит только 50 записей

Спасибо! А как я могу получить данные из таблицы order_address ведь leftjoin тут уже не поможет?

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Поможет. Их может быть сколько угодно ещё.

28 Отредактировано Илья (05.12.2016 15:17:12)

Re: Выводит только 50 записей

Закусило Александр пишет:

Поможет. Их может быть сколько угодно ещё.

Посмотрел по внимательней и получилось казалось бы. Я делаю 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 записи, как это может быть связано?

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Посмотрите, что в базе. Почитайте документацию к LEFT JOIN, добавьте группировку.

30 Отредактировано Илья (06.12.2016 10:30:08)

Re: Выводит только 50 записей

Получается следующее. Там находится 4 заказа, от незарегистрированного пользователя.  user_id у них получается одинаковый. И когда я добавляю

->groupby('C.user_id')

то они группируются и получается на выводе один заказ, а как быть в таком случае?

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

когда вы используете LEFT JOIN, то в этом случае, если записей у присединяемой таблицы больше чем у записи к которой присодиняется эта таблица, то записи в выдачи дублируются со стороны первой таблицы и не дублируюся со стороны второй.
Вам надо либо группировать по id заказа. Либо догружать записи потом. Что конкретно Вы хотите получить из таблицы с адресами пользователя? Количество адресов? или их самих?

32

Re: Выводит только 50 записей

Закусило Александр пишет:

когда вы используете LEFT JOIN, то в этом случае, если записей у присединяемой таблицы больше чем у записи к которой присодиняется эта таблица, то записи в выдачи дублируются со стороны первой таблицы и не дублируюся со стороны второй.
Вам надо либо группировать по id заказа. Либо догружать записи потом. Что конкретно Вы хотите получить из таблицы с адресами пользователя? Количество адресов? или их самих?

Сами адреса

Повысить оценку Понизить оценку

33 Отредактировано Закусило Александр (06.12.2016 14:34:03)

Re: Выводит только 50 записей

Тогда лучше догрузить из отдельным запросом потом. Либо если пользователей много. То из получившегося массива выдрать в отдельный массив. Далее сделать запрос к таблице адресов, где получить все адреса для нужных пользователей одним запрсом. Далее в получившемся массиве адресов пройтись по нему и собрать для заказов.
Ну например:

\RS\Orm\Request::make()
       ->from(new \Shop\Model\Orm\Address())
       ->whereIn('user_id', массив с id нужных пользователей)
       ->objects(null, 'user_id', true);

Запрос получит адреса объеденит по ключам user_id массив в подмассивы. Которые Вы можете использовать.

34

Re: Выводит только 50 записей

Скажите мне вот из этого массива, нужно получить массив с 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;

                }

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Да

$user_ids = array();
foreach($itemslist as $order){
   if (!in_array($order['user_id'], $user_ids)){ //Проверим если, ли уже в массиве такой id
          $user_ids[] = $order['user_id'];
   }
}

36 Отредактировано Илья (14.12.2016 12:42:00)

Re: Выводит только 50 записей

а это, как использовать это дальше?
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"
}

Повысить оценку Понизить оценку

37 Отредактировано Закусило Александр (14.12.2016 14:16:41)

Re: Выводит только 50 записей

Смотрите сообщение от 06.12.2016.

38

Re: Выводит только 50 записей

Закусило Александр пишет:

Далее в получившемся массиве адресов пройтись по нему и собрать для заказов.

верно?

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Да

40

Re: Выводит только 50 записей

вот это сделал, я выше не то указал.
Вто адреса получил, дальше то как их состыковать?

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"

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Я здесь не вижу адресов, это id пользователей из Ваших заказов. Вам надо сделать запрос на получение адресов как я и писал ранее.

$addreses_by_users = \RS\Orm\Request::make()
       ->from(new \Shop\Model\Orm\Address())
       ->whereIn('user_id', массив с id нужных пользователей который Вы уже получили)
       ->objects(null, 'user_id', true);

Далее перебрать массив с заказами и состыковать полученные адреса.

42 Отредактировано Илья (14.12.2016 16:24:54)

Re: Выводит только 50 записей

Дак это все сделано же уже, как состыковать то их. Снова дуаеощшт делать?

Повысить оценку Понизить оценку

43 Отредактировано Закусило Александр (14.12.2016 18:15:24)

Re: Выводит только 50 записей

Ну у Вас в массиве адресов все адреса распделены так, что у них есть общий ключ означающий id пользователя.
Соответственно, если перебрать массив заказов, где есть user_id, то из массива адресов адреса для конкретного пользователя можно достать по ключу пользователя. К примеру:

foreach($orders_data as &$order){
     $order['addresses'] = $addreses_by_users[$order['user_id']];
}

44

Re: Выводит только 50 записей

Но так мы получим только один адрес?

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Если Вы используете

$addreses_by_users = \RS\Orm\Request::make()
       ->from(new \Shop\Model\Orm\Address())
       ->whereIn('user_id', массив с id нужных пользователей который Вы уже получили)
       ->objects(null, 'user_id', true);

То в данном случае привяжется несколько адресов к одному пользователю. Попробуйте.

46 Отредактировано Илья (15.12.2016 11:27:16)

Re: Выводит только 50 записей

Вы меня не поняли немного. Там два заказа от разных пользователей, получается и адресов должно быть выведено, от каждого заказа свой адрес (т.е. 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']];
                }

Повысить оценку Понизить оценку

Re: Выводит только 50 записей

Вы забыли &

foreach($orders_data as &$order){
      $order['addresses'] = $addreses_by_users[$order['user_id']];
}

И судя по Вашему коду у Вас как частичное получение заказов, так и остальные данные заключены в цикл, который догружает данные. А в цикле должен быть только код получающий заказы, а уже далее должно происходить и подгрузка пользователей и адресов.

48

Re: Выводит только 50 записей

Закусило Александр пишет:

Вы забыли &

По прежнему выводит один адресс.

Закусило Александр пишет:

И судя по Вашему коду у Вас как частичное получение заказов, так и остальные данные заключены в цикл, который догружает данные. А в цикле должен быть только код получающий заказы, а уже далее должно происходить и подгрузка пользователей и адресов.

если я выношу код, за пределы цикла, то получаю ошибку
Исключение - "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']]);

Повысить оценку Понизить оценку

49 Отредактировано Закусило Александр (15.12.2016 12:28:25)

Re: Выводит только 50 записей

Вынесите за пределы цикла и смотрите что у Вас в $itemslist. Проследите что происходит $user_ids

50

Re: Выводит только 50 записей

Вынес вот это за пределы цикла

$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) { }

Повысить оценку Понизить оценку