私はCakePHP onプロジェクトとMVCベースプロジェクトを使って一連のテーブルを結合しています。私の研究では、これらの結合を行う2つの主な方法を見つけました。CakePhpは強制的に参加するのに対して 'contains'ですか?
'contains' - MVCフレームワークのモデルで既存の関連付けを使用することに重点を置いています。
'強制結合' - SQLのINNER JOIN型節に似ているため、特定の条件で複数の結合を行うことができます。
とにかく。私は、テーブルをまとめて集約するためにcontainsを使って始めましたが、それはうまく機能しましたが、私はその機能を少し複雑にする必要があるときに、強制結合を使用する必要があることを発見しました。
以下は、私のテーブルを集約して動作する方法を示しています。強制的な結合のための同様の構造化されたコードブロックがあります。なぜ私の強制結合が機能しないのでしょうか?私はドキュメンテーションのいくつかの研究を行い、すべて正しいと思われる。私は何が欠けていますか?
は、 '含む':
$tags = $this->OfficialTeams->Tags->find('all', ['conditions' => ['official' => true],
'contain' => ["Questions.Answers.Posts"] ]);
が
$options['joins'] = array(
array(
'table' -> 'Users',
'alias' -> 'Users',
'type' -> 'INNER',
'conditions' -> array('Users.id = Tag.user_id')
),
array(
'table' -> 'Posts',
'alias' -> 'Post',
'type' -> 'INNER',
'conditions' -> array('Users.id = Posts.user_id')
),
array(
'table' -> 'Questions',
'alias' -> 'Question',
'type' -> 'INNER',
'conditions' -> array('Questions.post_id = Posts.id')
),
array(
'table' -> 'Answers',
'alias' -> 'Answer',
'type' -> 'INNER',
'conditions' -> array('Answers.post_id = Posts.id')
)
);
$options['conditions'] = array(['official' => true]);
$tags = $this->OfficialTeams->Tags->find('all', $options);
を '強制加入' "OfficialTeams"、 "タグ"、 "回答"、 "ユーザー"、 "投稿" 内のすべてのテーブルですSQLデータベース。このコードはOfficialTeamsコントローラに配置されています。これは、「$ this」が公式チームを最初に参照していることを発見した理由です。
なぜなら、 'contains'はテーブルの既存のリレーションを使用するため、 'hasAndBelongsToMany'アソシエーションを使用できないためです。私はCakePHPのドキュメントでこれを見つけました。 https://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables
いずれにしても、私の強制結合クエリが機能していないという理由で、に関するヘルプは非常に高く評価されます。ありがとう!
EDIT:テーブルの関係。 Table Relationships are here
編集:私のバージョンはCake 3.3.10で、現在の動作と予想される動作は同じです。私はレンダリングされ、計算されたフォーム上のデータを集計し、さまざまなテーブルからデータベースから取得します。予想される動作は、2つの数字が表示されていることです(具体的には、これらの数字は特定のユーザーの公式チームによる質問/投稿/回答の数を表します)。そして、現在の動作については、question/posts/answersの数は警告です:array_map、引数2は配列でなければなりません。その現在のデータの値はnullです。
もう1つの奇妙な動作です。 'throws'コールでクエリを出力すると(強制的に失敗してクエリを出力できます) 'contains'ブロックのコードと 'force join'ブロックの両方のクエリは、まったく同じクエリです。
あなたのテーブル関係をここに入れます。 –
こんにちは@RayannNayran、私はテーブルの関係を追加しました。 – Matthew
もう少し具体的にしてください、 "_doesn't work_"は適切な問題の説明ではありません。正確には何が起こり、代わりに何が起こると思いますか?生成されたクエリはどのように見えますか?また、常にあなたの_exact_ CakePHPのバージョン( 'vendor/cakephp/cakephp/VERSION.txt'または' lib/Cake/VERSION.txt'の最後の行)をお伝えください - ありがとう! ps、 ' - >'は無効なPHPです。 – ndm