activerecord all() отдает некорректное количество строк

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

activerecord all() отдает некорректное количество строк

Сообщение RGF »

Подскажите, что делаю не так (встретил только на одном запросе, с другими все нормально)

В модели описываю связи:

Код: Выделить всё

public function getBlanks1()
{
	return $this->hasOne(Blanks1::className(), ['blank_id' => 'blank_id']);
}

public function getBlanks2()
{
	return $this->hasMany(Blanks2::className(), ['loc_id' => 'loc_id']);
}
пытаюсь получить все строки как массив из таблиц:

Код: Выделить всё

$data = Blanks::find()
		->select(['*'])
		->joinWith('blanks1')
		->joinWith('blanks2')
		->where(['loc_id' => $loc_id])


$data1 = $data->asArray()->all();

Получаю массив $data1 из 37 элементов

На вызов же:

Код: Выделить всё

$cnt = $data->count();
получаю 102

Если же вызвать

Код: Выделить всё

$data->createCommand()->getRawSql()
, то полученный запрос отдает те же самые 102 строки что и count
Последний раз редактировалось RGF 2017.08.18, 19:05, всего редактировалось 1 раз.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: activerecord all() отдает некорректное количество строк

Сообщение futbolim »

loc_id и в текущей модели и в Blanks2? Тут он первичный ключ, там внешний?
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

Это не ключ не там не там, а много ко многому.
Ключ он в другой таблице - справочнике, которая в данной выборке не используется.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: activerecord all() отдает некорректное количество строк

Сообщение futbolim »

Попробуйте воспользоваться CRUD-ом и посмотрите как он генерирует many_to_many связи
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

в дебаг панели посомтрите запросы и сравните их.
вангую что дело в joinWith
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

При создании темы несколько упростил пример, отчепятался в коде, поправил.
Но это дела собственно не меняет.

Пы.Сы.: Да, и с gii, oracle и связями, как то не получилось подружиться, все время ошибки вываливаются при создании модели.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

zelenin писал(а): 2017.08.18, 19:05 в дебаг панели посомтрите запросы и сравните их.
вангую что дело в joinWith
Так запрос же я получаю посредством:
$data->createCommand()->getRawSql()
он отдает 102 строки.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

RGF писал(а): 2017.08.18, 19:11
zelenin писал(а): 2017.08.18, 19:05 в дебаг панели посомтрите запросы и сравните их.
вангую что дело в joinWith
Так запрос же я получаю посредством:
$data->createCommand()->getRawSql()
он отдает 102 строки.
еще раз мой совет прочтите и сделайте как написано.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

Nex-Otaku писал(а): 2017.08.19, 09:10 groupBy забыли.
Он мне не нужен, мне нужны все комбинации.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

zelenin писал(а): 2017.08.18, 19:15 еще раз мой совет прочтите и сделайте как написано.
посмотрел , запрос полностью идентичен getRawSql
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

RGF писал(а): 2017.08.21, 11:42
zelenin писал(а): 2017.08.18, 19:15 еще раз мой совет прочтите и сделайте как написано.
посмотрел , запрос полностью идентичен getRawSql
причем тут getRawSql?
у вас есть два запроса - посмотрите их оба в дебаг-панели.
киньте сюда заодно.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

да, есть ньюансы: есть в панели запросов запрос

Код: Выделить всё

SELECT * FROM "BLANKS1" WHERE "BLANK_ID" IN ('417', '371', '407', '437', '385', '441', '438', '373', '408', '381', '409', '405', '387', '379', '281', '404', '375', '402', '413', '411', '439', '389', '440', '391', '363', '399', '364', '377', '369', '393', '423', '421', '425', '403', '406', '361', '302')
который отдает как раз 37 строк
Последний раз редактировалось RGF 2017.08.21, 12:14, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

то есть спустя три дня вы все-таки сознались, что запросы не совпадают) но привести их оба вы отказываетесь. такое ощущение как будто вы пообщаться на форум пришли, а не помощи попросили.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

Запросы совпадают:
SELECT *
FROM BLANKS
LEFT JOIN BLANKS1
ON BLANKS.BLANK_ID = BLANKS1.BLANK_ID
LEFT JOIN BLANKS2
ON BLANKS.BLANK_ID =
BLANKS2.BLANK_ID
WHERE (LOC_ID = '77000000000')

но массив берется из

SELECT * FROM "BLANKS1" WHERE "BLANK_ID" IN ('417', '371', '407', '437', '385', '441', '438', '373', '408', '381', '409', '405', '387', '379', '281', '404', '375', '402', '413', '411', '439', '389', '440', '391', '363', '399', '364', '377', '369', '393', '423', '421', '425', '403', '406', '361', '302')
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

хоть вы и пишете, что запросы совпадают, но они НЕ совпадают, и выдают разный результат. Дело раскрыто.
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

Не совсем :-)

Я расчитываю получить данные из
$data = Blanks::find()
->select(['*'])
->joinWith('blanks1')
->joinWith('blanks2')
->where(['loc_id' => $loc_id])

А получаю из $data = Blanks1::find()->where(['IN", 'ID', [1,2,3,4...]])

Что не соответствует замыслу и не описано в коде.

Вопрос, почему?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

так работает yii, а конкретно реляции. запрос разбивается на несколько.

попробуйте кстати

$data = Blanks::...;
$data2 = clone $data;

$array = $data->all();
$count = $data2->count();
RGF
Сообщения: 213
Зарегистрирован: 2013.01.29, 13:19

Re: activerecord all() отдает некорректное количество строк

Сообщение RGF »

count($array) = 37
$count = 102
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: activerecord all() отдает некорректное количество строк

Сообщение zelenin »

в in id первого или второго джойна? или обоих?
Ответить