0

Cakephpマニュアルの例、http: //book.cakephp.org/view/1323/Containable#Containing-deeper-associations-1325のように、アソシエーションモデルの条件を介してモデルからデータをフェッチする必要があります。

私は持っています:

モデル言語:

class Language extends AppModel {

    var $name = 'Language';
    var $actsAs = array('Containable');

        var $hasMany = array(
        'LanguageTranslation' => array(
            'className' => 'LanguageTranslation',
            'foreignKey' => 'language_id'
        )
    );

}

そして協会、ModelTranslation

class LanguageTranslation extends AppModel {

    var $name = 'LanguageTranslation';

    var $belongsTo = array(
        'Language'
    );
}

私がする時:

$language_array = $this->controller->Language->find('all', array(
            'contain' => "LanguageTranslation.id = 1" 
        ));

1つだけでなく、すべての言語を受け取ります(LanguageTranslationのidは一意であるため)。結果は1つである必要があります!

だから、

debug($language_array);

結果は次のとおりです。

Array
(
    [0] => Array
        (
            [Language] => Array
                (
                    [id] => 1
                    [code] => it
                    [locale] => ita
                )

            [LanguageTranslation] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [language_id] => 1
                            [language] => italiano
                        )

                )

        )

    [1] => Array
        (
            [Language] => Array
                (
                    [id] => 2
                    [code] => en
                    [locale] => eng
                )

            [LanguageTranslation] => Array
                (
                )

        )

    [2] => Array
        (
            [Language] => Array
                (
                    [id] => 3
                    [code] => de
                    [locale] => ger
                )

            [LanguageTranslation] => Array
                (
                )

        )
)

id = 1の言語だけをキャッチしないのはなぜですか?

4

3 に答える 3

2

リンク可能な動作でうまくいきます。

あなたはそれをダウンロードすることができます: https ://github.com/rafaelbandeira3/linkable

モデル

var $actsAs = array('Linkable');

コントローラ

$language_array = $this->Language->find('all', array(
    'link' => array('LanguageTranslation'),
    'conditions' => array("LanguageTranslation.id = 1")
));
于 2010-11-14T09:42:30.520 に答える
1

封じ込め可能な条件は、封じ込め内のモデルにのみ適用されます。メインクエリには条件がないため、テーブル内のすべての行をフェッチします。一般に、containableを使用してメインクエリを制限するのではなく、クエリが包含ツリーを通過する方法を制限します(3〜4レベルの再帰性を通過する必要がある場合、含まれていないと結果が非常に肥大化する可能性があります。 )。

この場合、特に特定の言語/言語翻訳ペアのデータを取得しようとしている場合は、LanguageTranslationモデルからデータを取得するだけです。

$this->Language->LanguageTranslation->find( 
    'first',
    array( 
        'conditions' => array( 'LanguageTranslation.id' => 1 ),
        'recursive'  => 1
    )
);
于 2010-11-13T13:34:46.143 に答える
0

Juhanaの答え:(最初は言語モデルでfindを呼び出します)に関しては、子モデルを対象とする親モデルの条件を指定できます。

別の呼び出しに含まれます。

<?php

$this->Language->contain(array(
    'LanguageTranslation'
));
$lang = $this->Language->find('first', array(
    'conditions' => array('LanguageTranslation.id' => 1)
));

?>

1回の呼び出しに含まれます。

<?php

$lang = $this->Language->find('first', array(
    'conditions' => array('LanguageTranslation.id' => 1),
    'contain' => array('LanguageTranslation')
));

?>

子モデルに条件を適用する必要がある場合は、contain呼び出しで子モデルのインデックスに条件配列を追加するだけです。例えば:

<?php

$this->Language->contain(array(
    'LanguageTranslation' => array(
        'conditions' => array('<LanguageTranslationConditionHere>')
    )
));

?>

お役に立てれば!

-アンドリュー

于 2013-03-22T20:53:08.807 に答える