CakePhp Containable Error: двухуровневая ассоциация не работает

StackOverflow https://stackoverflow.com//questions/11667817

  •  12-12-2019
  •  | 
  •  

Вопрос

Я делаю следующий запрос:

        $this->find('all',array(
            'contain' => array(
                'User' => array('id','facebook_id','name','username','Author' => array('first_name','last_name','code','photo')),
                'Tab.code'
            ),
            'fields' => array('Comment.date','Comment.time','Comment.content'),
            'conditions' => array(
                'Tab.code' => $code
            ),
            'limit' => $limit,
            'offset' => $offset
        ));
.

Комментарий ...

    public $belongsTo = array(
        'User' => array('foreignKey' => 'user_id'),
        'Tab' => array('foreignKey' => 'tab_id')
    );
.

Пользователь ...

    public $hasOne = array('Author' => array('foreignKey' => 'id'));
.

и автор ...

    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'id'
        )
    );
.

Это возвращает что-то вроде этого (в JSON) ...

[
    {
        "Comment": {
            "date": "2001-12-15",
            "time": "17:32:12",
            "content": "..."
        },
        "User": {
            "id": "29",
            "facebook_id": "1234",
            "name": "User 29",
            "username": "user29"
        },
        "Tab": {
            "code": "llibre-de-prova-29",
            "id": "229"
        }
    }
    ...
]
.

... Пока я ожидаю, что прикреплено к пользователю, появляется автор с указанными мной полями.Знаете ли вы, почему автор не появляется?Я сделал другой, содержит два уровня рекурсивности в коде и все работает, как и ожидалось.

Спасибо за вашу помощь и внимание!

Это было полезно?

Решение

Убедитесь, что ваша модель имеет контекстное поведение.Он должен включать следующую строку:

$actsAs = array('Containable');
.

Обратите внимание, чтобы убедиться, что вы не пропустили «S» в «acts», что является общим опечаткам, которое трудно обнаружить.Вы также можете прикрепить кондиционеруемое поведение на лету, как это:

$this->YourModel->Behaviors->attach('Containable');
$this->YourModel->find('all', array('contain' => array(...)));
.

Также убедитесь, что вы введите «содержащие» в качестве клавиши массива, а не «содержит».

Другие советы

Вам необходимо указать поля в клавише «Поля».Обратите внимание на это как дополнительный вызов find().

$this->find('all', array(
            'contain' => array(
                'User' => array(
                    'fields' => array('id','facebook_id','name','username'),
                    'Author' => array(
                        'fields' => array('first_name','last_name','code','photo')
                    ),
                    'Tab.code'
                ),
            ),
            'fields' => array('Comment.date','Comment.time','Comment.content'),
            'conditions' => array(
                'Tab.code' => $code
            ),
            'limit' => $limit,
            'offset' => $offset
        ));
.

 $this->find('all',array(
        'contain' => array(
            'User' => array('id','facebook_id','name','username','Author' =>array( 'AuthorModelName'=>array('first_name','last_name','code','photo'))),
            'Tab.code'
        ),
.

Все иностранные ключи должны быть в вашем полях массива

'fields' => array('Comment.date','Comment.time','Comment.content', 'Comment.user_id', ....)
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top