投稿テーブル、コンテンツテーブル、およびスペーステーブルを持つDBがありました。スペース内の投稿の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();
そしてPostモデルはポストのためのコンテンツオブジェクトを取得するには、この機能を持っていた:データベーススキーマが変更されるまで
public function getContent() {
return $this->hasOne(Content::className(), ['object_id' => 'id'])->andOnCondition(['{{content}}.object_model' => 'humhub\modules\post\models\Post']);
}
これは完全に働きました。
コンテンツテーブルには、もはやspace_id
という列はありません。代わりに、space_idに置き換えられるpk
フィールドとclass
フィールド(つまりspace
クラス)を持つ新しいテーブルcontentcontainer
があり、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):ポスト、コンテンツ、contentcontainer:
id
--------------
3
スペース内のすべての記事を取得するには、私は今、3つのテーブルをリンクする必要があります。
ポストモデルにcontentcontainer関係を追加しますか?または、ポストモデルでコンテンツモデルの関係を変更しますか?大したお粗末な質問を書かずにどのように取り組むのがベストか。
私はこれにコントローラ機能を変更:
$posts = Post::find()
->where(['{{contentcontainer}}.pk' => $space_id])
->andWhere(['{{contentcontainer}}.class' => 'humhub\modules\space\models\Space'])
ない、これは権利であると私はPost
モデルでcontentcontainer
関係を設定立ち往生していてください。
、投稿してください3つのテーブルの構造 – gmc
@gmcテーブル構造が追加されました – lilbiscuit