жадная with загрузка и при неуказанном родителе

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
xtsidx
Сообщения: 12
Зарегистрирован: 2011.05.06, 11:25
Откуда: Сочи
Контактная информация:

жадная with загрузка и при неуказанном родителе

Сообщение xtsidx »

Есть два AR в методах relations() которых указанно так:

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

// В User --->
'blog'=>array(self::HAS_MANY, 'Publication', 'pid')

// В Publication --->
'user'=>array(self::BELONGS_TO, 'User', 'pid')
 
Я хочу получить все Publication и их User.
Поэтому в критерии указываю

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

$criteria->with = array('user'=>array('select'=>'pid, name, name_ru'));
 
Но при этом хочу чтобы результать попали и те Publication у которых нет User (тоесть pid не указан).
Как мне это сделать, ведь в результат не попадают такие Publication.
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: жадная with загрузка и при неуказанном родителе

Сообщение because »

Странно что Publication без User не выбираются, насколько я знаю, по умолчанию ведь используется left join для запроса.
Попробуйте так:

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

$criteria->with = array('user'=>array('select'=>'pid, name, name_ru', 'joinType'=>'LEFT JOIN'));
 
RTFM !
Аватара пользователя
xtsidx
Сообщения: 12
Зарегистрирован: 2011.05.06, 11:25
Откуда: Сочи
Контактная информация:

Re: жадная with загрузка и при неуказанном родителе

Сообщение xtsidx »

Может ли это быть из за этого параметра критерия?

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

$criteria->condition='t.publish=1 AND user.publish=1'; 
если да, то как мне учесть это, чтобы
в результат попадали все Publication с неуказанным pid и те у которых pid указан при этом user->publish == 1?

Добавленно:
да это из за user.publish=1 они не попадают в результат.
Как отсеить все Publication у которых user->publish != 0
при этом не отсеивая publication у которых вовсе нет user (pid="")?
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: жадная with загрузка и при неуказанном родителе

Сообщение because »

Так ?

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

$criteria->condition='t.publish=1'; 
$criteria->with = array('user'=>array('select'=>'pid, name, name_ru', 'on'=>'user.publish=1'));
 
RTFM !
Аватара пользователя
xtsidx
Сообщения: 12
Зарегистрирован: 2011.05.06, 11:25
Откуда: Сочи
Контактная информация:

Re: жадная with загрузка и при неуказанном родителе

Сообщение xtsidx »

Спасибо!
Получилось, когда копал в документации пропустил это к сожалению.
Аватара пользователя
xtsidx
Сообщения: 12
Зарегистрирован: 2011.05.06, 11:25
Откуда: Сочи
Контактная информация:

Re: жадная with загрузка и при неуказанном родителе

Сообщение xtsidx »

Хотелось бы задать ещё один вопрос на подобную тему.

Есть также два AR класса, взаимоотношения у них установленны следующим образом:

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

// в Publication --->
'ext'=>array(self::HAS_ONE, 'PublicationExt', 'id')

// в PublicationExt --->
'publication'=>array(self::HAS_ONE, 'Publication', 'id')
 
далее я хочу получить некий массив Publication из определённых id (publication->id)

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

$criteria=new CDbCriteria;
$criteria->select='id, title, teaser, datetime, alert, pid';
$criteria->with = array('ext'=>array('select'=>'thumb_image'));
$where="t.id IN (";
foreach ($id_pubs as $id_post) {
    $where += "'". $id_post ."', ";
}
$where += ")";
$criteria->condition=$where;
$pubs = Publication::model()->findAll($criteria);
 
В итоге я не получаю ничего.
Скорее всего это из-за того, что в таблице физически не для всех Publication есть свой PublicationExt.
Если закоментировать строчку с with, то получаю что нужно, НО это уже не Жадная загрузка,
соответственно как я понимаю придётся ради каждого PublicationExt посылать SQL запрос.

Как в такой ситуации осуществить Жадную загрузку?
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: жадная with загрузка и при неуказанном родителе

Сообщение because »

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

$criteria->with = array('ext'=>array('select'=>'thumb_image', 'together'=>false));
 
RTFM !
Аватара пользователя
xtsidx
Сообщения: 12
Зарегистрирован: 2011.05.06, 11:25
Откуда: Сочи
Контактная информация:

Re: жадная with загрузка и при неуказанном родителе

Сообщение xtsidx »

К сожалению несработало.

может поможет trace:

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

SELECT `t`.`id` AS `t0_c0`, `t`.`title` AS `t0_c4`,
`t`.`teaser` AS `t0_c5`, `t`.`datetime` AS `t0_c7`, `t`.`alert` AS `t0_c3`,
`t`.`pid` AS `t0_c1`, `ext`.`thumb_image` AS `t1_c1`, `ext`.`id` AS `t1_c0`
FROM `pubs` `t`  LEFT OUTER JOIN `pubs_ext` `ext` ON (`ext`.`id`=`t`.`id`) 
WHERE (0)
все мои WHERE кудато делись.
Ответить