CakePHP可容纳不';用适当的方法过滤

CakePHP可容纳不';用适当的方法过滤,php,cakephp,models,containable,Php,Cakephp,Models,Containable,就像cakephp手册中的示例一样,我需要通过关联模型上的条件从模型中获取数据 $this->Language->LanguageTranslation->find( 'first', array( 'conditions' => array( 'LanguageTranslation.id' => 1 ), 'recursive' => 1 ) ); 我有: 模型语言: class Langua

就像cakephp手册中的示例一样,我需要通过关联模型上的条件从模型中获取数据

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

模型语言:

class Language extends AppModel {

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

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

}
以及模型翻译协会

class LanguageTranslation extends AppModel {

    var $name = 'LanguageTranslation';

    var $belongsTo = array(
        'Language'
    );
}
当我这样做时:

$language_array = $this->controller->Language->find('all', array(
            'contain' => "LanguageTranslation.id = 1" 
        ));
我收到所有的语言,而不仅仅是一种(因为语言翻译中的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的语言?

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

在这种情况下,特别是如果您试图获取某个语言/语言翻译对的数据,您可以从LanguageTranslation模型中提取数据

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

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

在这种情况下,特别是如果您试图获取某个语言/语言翻译对的数据,您可以从LanguageTranslation模型中提取数据

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

可链接的行为会起作用

您可以在以下网站下载:

模型 控制器
可链接的行为会起作用

您可以在以下网站下载:

模型 控制器
关于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')
));

?>

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

<?php

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

?>

希望这有帮助


-Andrew

关于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')
));

?>

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

<?php

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

?>

希望这有帮助


-安德鲁

好的,谢谢你的夸奖;因此,我认为手册中的示例是错误的。我同意手册如果没有错误,至少有一点误导性;因此,我认为手册中的例子是错误的。我同意手册如果没有错误,至少有一点误导。