首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP containable没有以正确的方式进行过滤

CakePHP containable没有以正确的方式进行过滤
EN

Stack Overflow用户
提问于 2010-11-13 21:14:53
回答 3查看 996关注 0票数 0

与cakephp手册中的示例http://book.cakephp.org/view/1323/Containable#Containing-deeper-associations-1325一样,我需要通过关联模型上的条件从模型中获取数据。

我有:

模型语言:

代码语言:javascript
复制
class Language extends AppModel {

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

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

}

和协会,ModelTranslation

代码语言:javascript
复制
class LanguageTranslation extends AppModel {

    var $name = 'LanguageTranslation';

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

当我这样做的时候:

代码语言:javascript
复制
$language_array = $this->controller->Language->find('all', array(
            'contain' => "LanguageTranslation.id = 1" 
        ));

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

因此,使用

代码语言:javascript
复制
debug($language_array);

结果是:

代码语言:javascript
复制
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的语言?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-13 21:34:46

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

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

代码语言:javascript
复制
$this->Language->LanguageTranslation->find( 
    'first',
    array( 
        'conditions' => array( 'LanguageTranslation.id' => 1 ),
        'recursive'  => 1
    )
);
票数 1
EN

Stack Overflow用户

发布于 2010-11-14 17:42:31

可链接的行为可以做到这一点。

你可以从以下网址下载:https://github.com/rafaelbandeira3/linkable

模型

代码语言:javascript
复制
var $actsAs = array('Linkable');

控制器

代码语言:javascript
复制
$language_array = $this->Language->find('all', array(
    'link' => array('LanguageTranslation'),
    'conditions' => array("LanguageTranslation.id = 1")
));
票数 2
EN

Stack Overflow用户

发布于 2013-03-23 04:53:09

关于Juhana的回答:(最初调用find on the Language Model),您可以为对象子模型的父模型提供条件。

包含在单独的调用中。

代码语言:javascript
复制
<?php

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

?>

包含在一个调用中。

代码语言:javascript
复制
<?php

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

?>

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

代码语言:javascript
复制
<?php

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

?>

希望这能有所帮助!

-Andrew

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4172670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档