Yii Framework Forum: запрос с MANY_MANY и with - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

запрос с MANY_MANY и with Rate Topic: -----

#1 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 01 July 2009 - 06:49 AM

Может торможу конечно, но...

в модели Item
public function relations()
{
        return array(
            'fotos'=>array(self::HAS_MANY, 'Fotos', 'itemID'),
  'categories'=>array(self::MANY_MANY, 'Category', 'ItemCategory(itemID, categoryID)',
  ),
        );
}

хочу вывести записи по конкретной категории $catid:

$withOption = array();
$withOption['categories']['alias']='categories';
$withOption['categories']['condition']="??.id='{$catid}'";

$criteria=new CDbCriteria;
$criteria->select = array('id','name');
$itemList=Item::model()->with($withOption)->findAll($criteria);

получаю полный список item безотносительно к $catid
запрос SQL выглядит так:

SELECT `Item`.`id` AS `t0_c0`, categories.`id` AS `t1_c0`, categories.`name` AS `t1_c1`, categories.`description` AS `t1_c2`, categories.`is_visible` AS `t1_c3` FROM `Item` LEFT OUTER JOIN `ItemCategory` categories_categories ON (`Item`.`id`=categories_categories.`itemID`) LEFT OUTER JOIN `Category` categories ON (categories.`id`=categories_categories.`categoryID`) AND (categories.id='3')  WHERE (`Item`.`id` IN (2, 30, 31, 32, 33, 34, 35))

и результат такой:
Posted Image


хотя я надеялся увидеть такой:

Posted Image

что я делаю неправильно?
0

#2 User is offline   Digital God 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 178
  • Joined: 30-January 09

Posted 01 July 2009 - 08:20 AM

Видимо у тебя есть категории с id 2,30,34 в которых ничего нету.
И вообще - если ты выводишь к конкретной категории записи, то не логичнее ли вызывать Category::model()->with('items')->findAll();

Ты как-то наизнанку вытаскиваешь все
0

#3 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 01 July 2009 - 09:01 AM

Quote

Видимо у тебя есть категории с id 2,30,34 в которых ничего нету.

И вообще - если ты выводишь к конкретной категории записи, то не логичнее ли вызывать Category::model()->with('items')->findAll();



Ты как-то наизнанку вытаскиваешь все


2, 30, 34 это id из items
запрос выводит ВСЕ items и связанные с ними категории где $catid = 3, а я надеюсь получить только items где $catid = 3

мне надо вывести именно items и названия категорий, где они присутствуют
на самом деле - тут всё упрощено до предела, в реальной базе 8 связанных на items таблиц, но вот relations many_many какой-то затык
0

#4 User is offline   Digital God 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 178
  • Joined: 30-January 09

Posted 01 July 2009 - 09:10 AM

Так, давай сначала правильно задачу поставим -
вывести итемы с id (2, 30, 31, 32, 33, 34, 35) при условии что они в категории с id 3?

если я правильно понял, то проще вообще having заюзать :) вообще вся причина в left join и кажется оно как-то меняться может... надо покапаться в доках
0

#5 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 01 July 2009 - 09:33 AM

Quote

Так, давай сначала правильно задачу поставим -

вывести итемы с id (2, 30, 31, 32, 33, 34, 35) при условии что они в категории с id 3?



если я правильно понял, то проще вообще having заюзать :) вообще вся причина в left join и кажется оно как-то меняться может... надо покапаться в доках


не итемы с id (...) а все итемы где catid = 3. having можно было бы юзать, если бы было поле catid у итемсов, а они свзяны с категориями через промежуточную таблицу с MANY_MANY

0

#6 User is offline   samdark 

  • Having fun
  • Yii
  • Group: Yii Dev Team
  • Posts: 3,345
  • Joined: 17-January 09
  • Location:Russia

Posted 01 July 2009 - 12:21 PM

Тут нужен всего один join с промежуточной таблицей т.к. id категории мы уже имеем.
0

#7 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 01 July 2009 - 01:47 PM

Quote

Тут нужен всего один join с промежуточной таблицей т.к. id категории мы уже имеем.

да кто бы спорил - вручную я напишу любой запрос, зачем мне тогда все релейшены и кондишены...
вопрос-то в том, что я прописал relations и прописал condition, по-моему правильно это сделал, сделал запрос - получаю на выходе не то что ожидал...
склонен всё-таки думать, что я где-то лопухнулся и кто-то увидит логику...
0

#8 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 02 July 2009 - 03:30 AM

Меня смущает LEFT OUTER JOIN... Я могу ошибаться, но попробуйте joinType => INNER JOIN (по умолчанию это LEFT OUTER JOIN: http://www.yiiframew...i/CActiveRecord).
0

#9 User is offline   duke1999 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 57
  • Joined: 01-March 09
  • Location:Russia

Posted 02 July 2009 - 06:05 AM

Quote

Меня смущает LEFT OUTER JOIN... Я могу ошибаться, но попробуйте joinType => INNER JOIN (по умолчанию это LEFT OUTER JOIN: http://www.yiiframew...i/CActiveRecord).

Ой спасибо! Правда, помогло только на одном запросе, когда включил остальные релейшены - всё опять наперекосяк... Поставил во все релейшены INNER JOIN и добавил ещё togeher() в запрос и тут всё стало нормально. Хотя шаманство какое-то...  :)
0

#10 User is offline   andy_s 

  • Random Member Title
  • Yii
  • Group: Moderators
  • Posts: 1,526
  • Joined: 22-June 09
  • Location:Russia, Kostroma

Posted 02 July 2009 - 07:51 AM

Quote

Quote

Меня смущает LEFT OUTER JOIN... Я могу ошибаться, но попробуйте joinType => INNER JOIN (по умолчанию это LEFT OUTER JOIN: http://www.yiiframew...i/CActiveRecord).


Ой спасибо! Правда, помогло только на одном запросе, когда включил остальные релейшены - всё опять наперекосяк... Поставил во все релейшены INNER JOIN и добавил ещё togeher() в запрос и тут всё стало нормально. Хотя шаманство какое-то...  :)


Ну если почитать про различия LEFT OUTER и INNER JOIN, то становится ясно, что при LEFT OUTER всегда будут возвращаться все записи первой таблицы. Судя по результатам в первом посте, так оно и происходило.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users