YII CActiveDataProvider с реляционными таблицами - PullRequest
4 голосов
/ 06 декабря 2011

У меня есть три таблицы:

  • Содержание (id)
  • ContentCategory (id_content, id_category)
  • Категория (id)

Отношения содержания,

'Categories' => array(self::MANY_MANY, 'Category', 'ContentCategory(id_content, id_category)'),
'category' => array(self::HAS_MANY, 'Category', 'id'),

Мне нужно получить все записи контента, которые имеют определенную категорию (в CActiveDataProvider для использования в CListView).

Когда я использую findAll (), я получаю нужные записи (это работает),

$model=Content::model()->with(array(
'Categorieses'=>array(
    'condition'=>'id_category=1',
),
))->findAll();

Но когда я делаю с CActiveDataProvider, я получаю все записи в контенте (не те, которые имеют конкретную категорию - не работает)

$dataProvider=new CActiveDataProvider('Content',
        array(
                'pagination'=>array('pageSize'=>15),
                'criteria'=>array(
                    'with'=>array(
                        'Categories'=>array(
                            'condition'=>'id_category=1',
                        ),
                    ),
                ),
            )
        );

Как я могу это сделать?

Большое спасибо!

Ответы [ 2 ]

13 голосов
/ 29 января 2012

Когда таблицы связаны с MANY_MANY или HAS_MANY, Yii иногда может разбить один запрос на два оператора SQL. Я считаю, что это для эффективности, но это может испортить то, что вы пытаетесь сделать, так как запрос категорий происходит в другом операторе SQL, чем запрос контакта.

Решение состоит в том, чтобы использовать менее известное свойство CDbCriteria, называемое together. Если вы установите значение true, это заставит запрос выбирать из обеих таблиц в одном и том же операторе SQL. Тогда ваше условие вступит в силу.

Если вы всегда хотите, чтобы это произошло, добавьте это в отношение:

Categories' => array(self::MANY_MANY, 'Category', 'ContentCategory(id_content, id_category)','together'=>true),

Если вы хотите это только в случае $dataProvider выше, добавьте его к параметрам, подобным этому:

'criteria'=>array(
   'with'=>array(
       'Categories'=>array(
            'condition'=>'id_category=1'
        ),
    ),
    'together'=>true,
),
0 голосов
/ 06 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...