2017-04-05 69 views
0

我有一個帶有發佈表,內容表和空間表的數據庫。Yii2查詢空間中的帖子

帖子是一種內容,空間是許多帖子的容器。我想獲得一個空間內的所有職位。

帖子:

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

內容(OBJECT_ID - > post.id):

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

空間(ID - > content.space_id):

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

要在一個空間內獲得帖子,控制器功能如下所示:

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

和後模型具有此功能來獲取內容對象後:

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

這完美地工作,直到數據庫架構改變。

現在內容表中不再有space_id列。取而代之的是,新表contentcontainer具有替換space_id的pk字段和012xx字段(即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 

空間(ID - > contentcontainer):

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

爲了得到一個空間內的所有帖子,我現在有鏈接3個表:文章,內容contentcontainer。

是否將contentcontainer關係添加到Post模型?或者修改Post模型中的內容模型關係?不知道如何寫出最好的解決方案,而不需要寫出大量的草率查詢。

我改變了控制器的功能是:

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

不知道這是正確的,我堅持設置在Post模型contentcontainer關係。

+0

請,張貼3表結構 – gmc

+0

@gmc表結構添加 – lilbiscuit

回答

0

這裏就是我如何解決這個(結果是從內容模型拉,不要發佈模型):

$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(); 
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做兩聯接歐洲工商管理學院之一。

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'); 
}