我有一个带有帖子表,内容表和空格表的数据库。
帖子是一种内容,空格是许多帖子的容器。我想获得一个空间内的所有帖子。
发表:
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
关系时遇到困难。
答案 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();