代码之家  ›  专栏  ›  技术社区  ›  apelliciari

CakePHP containable不能正确过滤

  •  0
  • apelliciari  · 技术社区  · 15 年前

    就像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'
            )
        );
    
    }
    

    以及协会,模型翻译

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   JJJ Sergey    15 年前

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

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

    $this->Language->LanguageTranslation->find( 
        'first',
        array( 
            'conditions' => array( 'LanguageTranslation.id' => 1 ),
            'recursive'  => 1
        )
    );
    
        2
  •  2
  •   devius    15 年前

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

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

    模型

    var $actsAs = array('Linkable');
    

    控制器

    $language_array = $this->Language->find('all', array(
        'link' => array('LanguageTranslation'),
        'conditions' => array("LanguageTranslation.id = 1")
    ));
    
        3
  •  0
  •   Andrew Senner    13 年前

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

    希望这有帮助!

    -安德鲁