0

私はcakephp 2.1.1を使用しています。これは私のテーブルの関連付けです: x hasmany y hasmany z hasmany w.

すべてが正しくセットアップされていると思いますが、このクエリを作成すると:

$conditions = array(
'contain' => array(
'y' => array (
            'z' => array(
                'w'=> array(
                    'conditions' => array('col>=' => $q))
     )
 )
 ));

$this->loadmodel('x');
 $o=$this->x->find('all',$conditions);//array(
 debug($o);

欲しい結果がありません。テーブル x のみがフェッチされます。なぜ?たとえば、これは他のモデルと同様の私のモデル x php コードです。

 <? php

class x extends AppModel
{
    var $name='x';
    public $actsAs = array('Containable');
    public $hasMany = array( 'y');
}

おそらくcakephpバージョン?ありがとう!

info: 次のようなステートメントを作成したい:

select z.col1, y.col2, x.col3
from z, y, x, w
where  w.col>= 3
and w.z_id = z.id
and z.y_id = y.id
and z.x_id = x.id
4

1 に答える 1

1

ここにはかなりのポイントがあります。

まず、ビヘイビアーが機能していない場合、何も仮定しないでください。特に、すべてが正常であるとは限りません。;)

Cake がモデルをリンクする場合に非常に重要な外部キーが定義されていないため、大量のコードを削除したと思います。

loadModel()Model X のコントローラーまたは X Model でこの種のことを行う必要があるため、なぜ使用しているのかわかりません。したがって、モデルをロードする必要はありません。関連付けが適切に機能している場合、Contain は進行中にモデルをロードします。

予想される SQL ステートメントに関しては、残念ながら Containable はこのようなモデルを結合せず、いくつかのモデルを結合しますがhasMany、一連のSELECTステートメントを実行して追加のデータを取得し、すべて結合します。

またLEFT JOIN、予想される ではなくa を使用しますCROSS JOIN。ただし、これは Containable のオプションで構成することも、新しい db オブジェクトをインスタンス化してサブクエリを作成することもできます。

あなたの問題に戻るには、

  • ここでまずモデルの関連付けを確認します。
  • 本を読んで、関連付けを適切に作成しているかどうかを確認します。 http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany
  • また、実際のデータベース スキーマが正しいことを確認します。外部キーが命名規則に従っているか、モデルで定義されています。
  • モデル ファイルをバックアップして、Cake Console を使用して、ベイクされcake bake modelたモデルがContain 適切に動作するかどうかを確認します。

もちろん、まだこれを解決していない場合は、これが出発点になることを願っています!

于 2012-07-27T09:43:30.227 に答える