Yii关系活动记录中的两级"with"

Hua*_*ieh 0 php yii

我有三张桌子:

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

每个帖子都有多个标签,每个标签都有多个帖子.(很多很多)

每个帖子只有一个用户,每个用户有多个帖子.

tbl_post_tag用来记录Post和Tag之间的关系.

现在我想通过tag_id检索所有帖子(比如显示所有帖子和相应的用户,tag_id = 1)

我真的不知道该怎么做.

我的猜测是使用Tag::model()->with("post")->findByPk(1),但是这会同时检索用户吗?

或者有更好的方法来完成这项工作吗?

谢谢!

tha*_*smt 6

只是为了澄清一下,您想要使用单个标签获取所有帖子(以及发布它的用户)吗?

在Tag模型中设置以下关系(如果您使用Gii或yiic生成代码,它应该已经存在):

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

这将允许您使用标记获取所有帖子,如下所示:

$myTag = Tag::model()->findByPk(1);
$posts = $myTag->posts;
Run Code Online (Sandbox Code Playgroud)

这不会得到用户.如果您想要每个帖子的用户,请执行以下操作(假设您在Post模型中的用户和帖子之间设置了正确的关系):

foreach ($myTag->posts as $post) {
  $theUser = $post->user;
  $theUsersName = $post->user->name;
}
Run Code Online (Sandbox Code Playgroud)

with()您提到的命令是关于效率的,因为它只是预先加载关系请求,而不是在您调用它时等待每个请求.您可以在此处类参考中阅读更多相关信息.

这可能不是你想要的.你的问题不是很清楚.

如果您尝试执行大型JOIN查询,则需要继续编写JOIN查询.这取决于你在做什么.将JOIN和SELECT条件添加到findall()语句中并不算太糟糕.

祝好运!