Контейнерная модель CakePHP не получена - PullRequest
2 голосов
/ 01 июня 2011

У меня есть следующий код, в котором я нахожу один тег. Я хочу содержать все сообщения, которые относятся к тегу, который не был "удален". Затем я хочу найти все теги, к которым принадлежат эти сообщения.

В качестве теста я прикрепил две модели к Post на рекурсии третьего уровня, Tag и User, с помощью содержимого. Содержимое поведения извлекает модель пользователя, связанную с публикацией, но модель тега, связанная с публикацией, не отображается. Любая идея, если этот тип рекурсии (на основе исходной модели) разрешен в CakePHP?

Я пробовал содержимое с условиями Tag и без них, поэтому я знаю, что это не является причиной проблемы. Если это было проблемой, то я должен получить пустой массив тегов, но там ничего нет.

$tag = $this->Tag->find(
    'first',
    array(
        'conditions' => $conditions,
        'contain' => array(
            'Post' => array(
                'conditions' => array(
                    'Post.deleted' => 0
                ),
                'limit' => 25,
                'User',
                'Tag' => array(
                    'conditions' => array(
                        'Tag.deleted' => 0
                    )
                )
            )
        )
    )
);

Я знаю, что есть способы обойти это, но меня особенно интересует, почему сдерживаемое поведение делает это. Я уверен, что более эффективно получить все теги для сообщения в этом вопросе, а не циклически просматривать результаты сообщения и повторно запрашивать теги. Я надеюсь, что у кого-то будет опыт решения этой проблемы, но сегодня я покопаюсь в коде поведения CakePHP Containable, чтобы узнать, предназначен ли он для фреймворка или возможной ошибки.

1 Ответ

3 голосов
/ 01 июня 2011

Это не реальный ответ на вопрос (это скорее причина того, почему это происходит), но я думаю, , вот почему это происходит и как обойти это. Я копался в классе Containable, и запрос строился с моей неповрежденной моделью Tag, что заставило меня поверить, что запрос и ассоциация в классе Model, вероятно, удаляют его, потому что Tag неоднозначен. Тег будет отображаться как с левой, так и с правой стороны записи Post, поэтому он, вероятно, удаляется, чтобы предотвратить зацикливание рекурсии. Мне было лень копаться в классе Model, чтобы получить реальный ответ.

Для решения этой проблемы я привязал псевдоним модели к публикации на лету, который называется PT . Я добавил этот псевдоним в содержащий код и вуаля, мои теги были там!

$this->Tag->Post->bindModel(
            array(
                'hasAndBelongsToMany' => array(
                    'PT' => array(
                        'className' => 'Tag'
                    )
                )
            )
        );

И содержащий код ...

$tag = $this->Tag->find(
            'first',
            array(
                'conditions' => $conditions,
                'contain' => array(
                    'Post' => array(
                        'conditions' => array(
                            'Post.deleted' => 0
                        ),
                        'User',
                        'PT' => array(
                            'conditions' => array(
                                'PT.deleted' => 0
                            )
                        )
                    )
                )
            )
        );
...