Yii двухуровневый «с» в реляционной активной записи - PullRequest
0 голосов
/ 25 февраля 2011

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

  1. tbl_tag
  2. tbl_post
  3. tbl_post_tag(post_id, tag_id)
  4. tbl_users.

Каждая запись имеет несколько тегов, а каждая запись имеет несколько сообщений. (MANY_MANY)

Каждый пост имеет только одного пользователя, а каждый пользователь имеет несколько постов.

Я использую tbl_post_tag для записи отношений между Post и Tag.

Теперь я хочу получить все сообщения по tag_id (например, показать все сообщения и соответствующего пользователя с tag_id = 1)

Я действительно не знаю, как это сделать.

Я предполагаю использовать Tag::model()->with("post")->findByPk(1), но извлекает ли это пользователей одновременно?

Или есть ли лучший способ сделать эту работу?

Спасибо!

1 Ответ

6 голосов
/ 25 февраля 2011

Просто чтобы уточнить, вы хотите получить все сообщения (и пользователя, который их разместил) с одним тегом?

Установите следующее отношение в модели тегов (оно должно быть уже там, если вы сгенерировали код с помощью Gii или yiic):

public function relations()
{
  return array(
    'posts'=>array(self::MANY_MANY, 'Post', 'tbl_post_tag(post_id, tag_id)'),
  );
}

Это позволит вам получить все сообщения с таким тегом:

$myTag = Tag::model()->findByPk(1);
$posts = $myTag->posts;

Это не получает пользователя, хотя. Если вы хотите, чтобы пользователь каждого поста делал что-то вроде этого (при условии, что у вас установлены правильные отношения между пользователем и постом в модели поста):

foreach ($myTag->posts as $post) {
  $theUser = $post->user;
  $theUsersName = $post->user->name;
}

Упомянутая вами команда with() относится к эффективности, так как она просто предварительно загружает реляционные запросы, вместо того, чтобы ждать выполнения каждого из них при вызове. Вы можете прочитать больше об этом здесь и в Справочнике классов .

Возможно, это не то, что вы ищете. Ваш вопрос был не совсем понятен.

Если вы пытаетесь выполнить большой запрос JOIN, вам нужно будет продолжить и, вероятно, написать запрос JOIN. Это зависит от того, что вы делаете, хотя. Не так уж плохо добавить условия JOIN и SELECT в оператор findall () .

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...