Содержимое CakePHP не фильтруется должным образом - PullRequest
0 голосов
/ 13 ноября 2010

Как и в примере из руководства по 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" 
        ));

Я получаю все языки, а не только один (потому что id в LanguageTranslation уникален). Результат должен быть один!

ТАК, с

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 ]

2 голосов
/ 14 ноября 2010

связанное поведение поможет вам.

Вы можете скачать его на: https://github.com/rafaelbandeira3/linkable

MODEL

var $actsAs = array('Linkable');

КОНТРОЛЛЕР

$language_array = $this->Language->find('all', array(
    'link' => array('LanguageTranslation'),
    'conditions' => array("LanguageTranslation.id = 1")
));
1 голос
/ 13 ноября 2010

Условия содержания могут применяться только к моделям внутри защитной оболочки. Поскольку основной запрос не имеет никаких условий, он выбирает каждую строку в таблице. Как правило, вы используете неableable для ограничения основного запроса, а для ограничения пути прохождения запроса по дереву содержимого (очень удобно, когда вам нужно пройти через 3-4 уровня рекурсивности, где результаты могут стать довольно раздутыми, если они не содержатся). ).

В этом случае, в частности, если вы пытаетесь получить данные определенной пары Language / LanguageTranslation, вы можете просто извлечь данные из модели LanguageTranslation.

$this->Language->LanguageTranslation->find( 
    'first',
    array( 
        'conditions' => array( 'LanguageTranslation.id' => 1 ),
        'recursive'  => 1
    )
);
0 голосов
/ 23 марта 2013

Что касается ответа Джуханы: (который первоначально вызывает 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

...