У меня простая структура:
Пользователи имеют сообщения, сообщения имеют теги.
Как я могу получить все теги, которые присвоены постам данного пользователя?
Я пытался сделать это так:
$criteria = new CDbCriteria();
$criteria->together = true;
$criteria->with = array('posts');
$criteria->addSearchCondition('posts.user_id', $this->id);
//or this (by the way, what's the difference?):
//$criteria->compare('posts.user_id', $this->id);
$tags = Tag::model()->findAll($criteria);
Но у него есть проблемы .. Это условие дают мне теги, которые присваиваются ТОЛЬКО постам этого пользователя. Но мне нужно получить теги, которые присвоены хотя бы одному посту этого пользователя.
Другими словами, если это тег, которому присваиваются два сообщения: post1 и post2 (post1.user_id = 1 post2.user_id = 2), но у моего пользователя id = 1, этот тег не будет в результате. Но я хочу получить этот тег, потому что он назначен с post1 (post1.user_ud = 1), и мне наплевать на другие сообщения / пользователей.
Если я правильно понимаю, вы ищете способ получить все теги, которые когда-либо использовал пользователь.
Самый простой способ установить MANY_to_MANY rel — это отношения модели:
в вашей модели пользователя:
function relations()
{
return array(
'tags' => array(
self::MANY_MANY,
'Tag',
'posts(user_id, tag_id)'
),
);
}
и тогда с вашей моделью вы просто сможете запросить их:
//gives you all the tags for user with PK 1
$usertags = User::model()->findByPK(1)->tags;
Ссылка : http://www.yiiframework.com/doc/guide/1.1/en/database.arr#declaring-relationship
РЕДАКТИРОВАТЬ: на основе комментариев я редактирую свой пост с большим количеством примеров на Active Record
$criteria=new CDbCriteria;
$criteria->with='tags';
$criteria->select='tag_name';
$criteria->condition='user=:userID';
$criteria->params=array(':userID'=>10);
$usertags =User::model()->findAll($criteria);
Других решений пока нет …