繁体   English   中英

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

[英]Yii two-level “with” in Relational Active Record

我有三个表:

  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) ,但这是否可以同时检索Users?

还是有更好的方法来完成这项工作?

谢谢!

只是为了澄清一下,您想使用单个Tag获得所有帖子(以及发布该帖子的用户)吗?

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

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

这将使您获得所有带有Tag的帖子,如下所示:

$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()语句还不错。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM