0

私は CakePHP 2.0 で開発されたサイトを持っています。多くのテーブルを持つデータベースがあり、2 つのテーブルを関連付けたいと考えています。私はこれを何度も行ってきましたが、2 つのテーブルではこれを行うことができず、その理由もわかりません。これは私の2つのテーブルです:

成分エイリアス:

id             INT(10) UNSIGNED AUTO_INCREMENT 
ingredient_id  INT(10)          
user_id        INT(10)          
alias          VARCHAR(100) latin1_swedish_ci 

活動_成分

id             INT(10) UNSIGNED     
activity_id    INT(11)      
ingredient_id  INT(10)          
created        DATETIME

component_id は私の外部キーで、これが私のモデルです。私の外部キーを作成したいと思いingredient_idます。

class ActivityIngredients extends AppModel{
        public $name = 'ActivityIngredients'; 
        public $useTable = 'activity_ingredients';

        public $belongsTo = array(
            'IngredientAlias' => array(
                'className'     => 'IngredientAlias',
                'conditions'    => '',
                'order'         => '',
                'foreignKey'    => 'ingredient_id'
            )
        );


    }

class IngredientAlias extends AppModel {
    public $name = 'IngredientAlias';
    public $useTable = 'ingredient_aliases';
    public $belongsTo = array(
        'Ingredient' => array(
            'className'    => 'Ingredient',
            'foreignKey'   => 'ingredient_id'
        ),
         'User' => array(
            'className'    => 'User',
            'foreignKey'   => 'user_id'
        )
    );

    public $hasMany = array (
        'ActivityIngredients' => array (
            'className'     => 'ActivityIngredients',
            'dependent' => true,
            'foreignKey'   => false,
            'associatedKey'   => 'ingredient_id'            
        )
    );

変数の var_dump を作成すると、IngredientAlias何もありません。外部キーを取得しないように空です..なぜですか? 問題は関係にありますか?私は書いてみました

'foreignKey'   => 'ingredient_id'

しかし、何も..同じ

クエリは3つの再帰的な単純なクエリであり、問​​題はないと思いますが、テーブルとの関係にあります..

4

1 に答える 1

1

これは、hasMany/belongsTo 関係がどのように機能するかではありません。

現在のコードは、次の関係を記述しています。

  • ActiveIngredient 属する IngredientAlias
  • IngredientAlias 多くを持っています ActiveIngredient

これは から までの1 対多の関係IngredientAliasですActiveIngredient

ただし、データベース スキーマでは、次のテーブルの関係が記述されています。

  • ActiveIngredient 属する Ingredient
  • Ingredient 多くを持っています ActiveIngredient
  • IngredientAlias 属する Ingredient
  • Ingredient 多くを持っています IngredientAlias

つまり、 から への1 対多の関係と、 からIngredientActiveIngredientの別の1 対多の関係IngredientですIngredientAlias

したがって、モデルの関係は、データベース スキーマが正確に記述している必要があります。(また、外部キーは候補キーを参照する必要があります。MySQL では、候補キーを参照しない外部キー制約を作成できますが、他のほとんどのデータベースではこれが許可されていないと思います。したがって、CakePHP もおそらく許可していません。 .)

最後に、recursiveCakePHP のレベル範囲は-12(両端を含む) です。recursiveのレベルはありません3。単に に設定recursiveする2と、findAllonはその親とその親の子ActiveIngredientを返します。 IngredientIngredientIngredientAliases


編集:
recursive内部で複数のクエリを使用します。ただし、ほとんどの場合、必要のないモデルから不要なデータを大量に取得します。を使用unbindModel()して不要な関連付けを削除するか、可能であれば、 を設定recursiveして-1使用joinsして関連付けられたデータを取得することをお勧めします。

最初のオプションの別のバリエーションは、 Containable 動作を使用することです。これにより、返される正確なリレーションとフィールドを定義できます。これは通常、再帰クエリを必要とする検索結果を最適化する最も簡単な方法です。

于 2012-07-22T10:53:10.843 に答える