Yii2查询空间中的帖子

时间:2017-04-05 17:51:05

标签: yii2 yii2-model

我有一个带有帖子表,内容表和空格表的数据库。

帖子是一种内容,空格是许多帖子的容器。我想获得一个空间内的所有帖子。

发表:

id   object_id
--------------
1    22

内容(object_id - > post.id):

id   space_id
------------------------
22   3

Space(id - > content.space_id):

id   
--------------
3

要获取空间内的帖子,控制器功能如下所示:

$posts = Post::find()
  ->joinWith('content', false)
  ->where(['{{content}}.space_id' => $space_id])
  ->all();

Post模型有这个函数来获取帖子的内容对象:

public function getContent() {
   return $this->hasOne(Content::className(), ['object_id' => 'id'])->andOnCondition(['{{content}}.object_model' => 'humhub\modules\post\models\Post']);
}

在数据库架构发生变化之前,这种方法非常有效。

现在内容表中不再有space_id列。相反,有一个新表contentcontainer,其中pk字段替换space_id,而class字段(即space类)用于标识PK用于空格(表格中还有class

表/关系现在是:

邮政表:

id   object_id
--------------
1    22

内容表(object_id - > post.id):

id   contentcontainer_id
------------------------
22   5

Contentcontainer表(id - > content.contentcontainer_id)

id   pk   class
---------------
5    3    //Space

Space(id - > contentcontainer):

id   
--------------
3

要获取空间中的所有帖子,我现在必须链接3个表:post,content,contentcontainer。

我是否将内容容器关系添加到Post模型?或修改Post模型中的内容模型关系?不知道如何在不编写大量草率查询的情况下解决问题。

我将控制器功能更改为:

$posts = Post::find()
  ->where(['{{contentcontainer}}.pk' => $space_id])
  ->andWhere(['{{contentcontainer}}.class' => 'humhub\modules\space\models\Space'])

不确定这是否正确,我在contentcontainer模型中设置Post关系时遇到困难。

3 个答案:

答案 0 :(得分:0)

好像你有一个联结表 - contentcontainer。官方Yii2文档how to decalre relation via a junction table中有一个例子。

在你的情况下,Post模型中的关系可能是这样的:

public function getItems()
{
    return $this->hasMany(Content::className(), ['id' => 'pk'])
        ->viaTable('contentcontainer', ['class' => 'space_id']);
}

现在你的控制器函数会让$posts做两个加入的一个加入。

答案 1 :(得分:0)

Space模型中创建此方法:

public function getPosts() {
  return Post::find()
    ->innerJoin('contentcontainer', ['and', 
        'contentcontainer.pk = space.id',
        'contentcontainer.class = "humhub\modules\space\models\Space"'])
    ->innerJoin('content', 'content.contentcontainer_id = contentcontainer.id')
    ->innerJoin('post', 'post.object_id = content.id');
}

答案 2 :(得分:0)

以下是我解决这个问题的方法(结果来自内容模型,而不是Post模型):

    $content = Content::find()
     ->joinWith('contentContainer')
     ->andWhere(['{{contentcontainer}}.pk' => $space_id])
     ->andWhere(['{{contentcontainer}}.class' => 'humhub\modules\space\models\Space'])
     ->andWhere(['{{content}}.object_model' => 'humhub\modules\post\models\Post'])
     ->asArray()
     ->all();