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

我收到所有语言,而不仅仅是一种(因为 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 的语言?

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 级递归时非常方便,如果不包含结果可能会变得非常臃肿)。

在这种情况下,特别是如果您尝试获取某个 Language/LanguageTranslation 对的数据,您可以从 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)
));

?>

包含在一个呼叫中。

<?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>')
    )
));

?>

希望这可以帮助!

-安德鲁

于 2013-03-22T20:53:08.807 回答