2017-05-09 7 views
0

私は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'ブロックの両方のクエリは、まったく同じクエリです。

+0

あなたのテーブル関係をここに入れます。 –

+0

こんにちは@RayannNayran、私はテーブルの関係を追加しました。 – Matthew

+0

もう少し具体的にしてください、 "_doesn't work_"は適切な問題の説明ではありません。正確には何が起こり、代わりに何が起こると思いますか?生成されたクエリはどのように見えますか?また、常にあなたの_exact_ CakePHPのバージョン( 'vendor/cakephp/cakephp/VERSION.txt'または' lib/Cake/VERSION.txt'の最後の行)をお伝えください - ありがとう! ps、 ' - >'は無効なPHPです。 – ndm

答えて

0

私は似たラットの巣に「含む」を使用していますが、これは巧みに(再帰的な)パラメータを操作するときに見られます。

多対多リレーションシップを処理する中間テーブルを作成する方法はありますか?これは私が '含んでいる'を使うことができるようにしたもので、私にとってはもっとケーキネイティブに思えました。

関連する問題