CakePHP可包含不会以适当的方式过滤

时间:2010-11-13 13:14:53

标签: php cakephp models containable

与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" 
        ));

我收到所有语言,而不仅仅是一种语言(因为LanguageTranslation中的id是唯一的)。结果必须是一个!

所以,

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的语言?

3 个答案:

答案 0 :(得分:2)

可链接的行为将起到作用。

您可以下载: https://github.com/rafaelbandeira3/linkable

MODEL

var $actsAs = array('Linkable');

CONTROLLER

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

答案 1 :(得分:1)

可包含的条件仅适用于收容内的模型。因为主查询没有任何条件,所以它会获取表中的每一行。通常,您不使用可包含来限制主查询,而是限制查询通过包含树的方式(当您需要经历3-4级递归时非常方便,如果不包含,结果会变得非常膨胀)。

在这种情况下,特别是如果您尝试获取某个Language / LanguageTranslation对的数据,您只需从LanguageTranslation模型中提取数据。

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

答案 2 :(得分:0)

关于Juhana的回答:(最初在语言模型上调用find),您可以为以子模型为目标的父模型提供条件。

包含在单独的电话中。

<?php

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

?>

包含一个电话。

<?php

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

?>

如果需要对子模型应用条件,只需将条件数组添加到包含调用中的子模型索引即可。例如:

<?php

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

?>

希望这有帮助!

-Andrew