Как получить связанные с HABTM данные, используя привязку hasOne - PullRequest
0 голосов
/ 31 декабря 2010

Я следую примеру, задокументированному на http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

Я пытаюсь получить связанные данные, используя hasOne.

Я создал 3 таблицы posts, tags и posts_tags. Я написал следующий код для отладки сообщений.

$this->Post->bindModel(array(
    'hasOne' => array(
        'PostsTag',
        'FilterTag' => array(
            'className' => 'Tag',
            'foreignKey' => false,
            'conditions' => array('FilterTag.id = PostsTag.tag_id')
))));
$output=$this->Post->find('all', array(
        'fields' => array('Post.*')
));
debug($output);

Я ожидал, что получится что-то вроде ниже.

Array
(  
    0 => Array
        {
        [Post] => Array
            (
                [id] => 1
                [title] => test post 1
            )
    [Tag] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => php
                )
           [1] => Array
                (
                    [id] => 2
                    [name] => javascript
                )
           [2] => Array
                (
                    [id] => 3
                    [name] => xml
                )
        )
}

Но мой вывод вообще не имеет тегов. Вот что я получил.

Array
(
    [0] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

        )

    [1] => Array
        (
            [Post] => Array
                (
                    [id] => 2
                    [title] => test post2
                )

        )
)

Как получить связанные теги вместе с сообщением.

Я знаю, что что-то упустил, но не могу понять. Любая помощь будет принята с благодарностью.


Редактировать 1:

Хорошо, я попробовал еще несколько вариантов.

Я пытался:

$this->Post->bindModel(array(
'hasOne' => array(
        'PostsTag',
        'FilterTag' => array(
            'className' => 'Tag',
            'foreignKey' => false,
            'conditions' => array('FilterTag.id = PostsTag.tag_id')
))));
$output=$this->Post->find('all');

Я получил:

Array
(
    [0] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

            [PostsTag] => Array
                (
                    [id] => 1
                    [post_id] => 1
                    [tag_id] => 1
                )

            [FilterTag] => Array
                (
                    [id] => 1
                    [name] => php
                )

        )

    [1] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

            [PostsTag] => Array
                (
                    [id] => 2
                    [post_id] => 1
                    [tag_id] => 2
                )

            [FilterTag] => Array
                (
                    [id] => 2
                    [name] => javascript
                )

        )

    [2] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

            [PostsTag] => Array
                (
                    [id] => 3
                    [post_id] => 1
                    [tag_id] => 3
                )

            [FilterTag] => Array
                (
                    [id] => 3
                    [name] => xml
                )

        )
)

Я пытался:

$output=$this->Post->find('all', array(
        'fields' => array('Post.*', 'FilterTag.*'),
        'recursive' => 1
));

Я получил:

Array
(
    [0] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

            [FilterTag] => Array
                (
                    [id] => 1
                    [name] => php
                )

        )

    [1] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

            [FilterTag] => Array
                (
                    [id] => 2
                    [name] => javascript
                )

        )

    [2] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => test post1
                )

            [FilterTag] => Array
                (
                    [id] => 3
                    [name] => xml
                )

        )
)

На всякий случай, если я что-то упустил, вот мой контроллер сообщений:

class PostsController extends AppController {
    var $name = 'Posts';
    var $helpers = array('Html','Ajax','Javascript');
    var $components = array( 'RequestHandler' );

    function index() {
        $this->Post->bindModel(array(
            'hasOne' => array(
                'PostsTag',
                'FilterTag' => array(
                    'className' => 'Tag',
                    'foreignKey' => false,
                    'conditions' => array('FilterTag.id = PostsTag.tag_id')
        ))));

        $output=$this->Post->find('all', array(
                'fields' => array('Post.*', 'FilterTag.*'),
                'recursive' => 1
        ));

    }
}

А вот моя модель сообщения:

class Post extends AppModel {
    var $name = 'Post';
}

Мне все еще интересно, почему пример из кулинарной книги не работает.

1 Ответ

0 голосов
/ 31 декабря 2010

Я бы рекомендовал проверить 3 вещи:

  1. Проверьте, правильно ли вы установили свои ассоциации (hasMany, hasAndBelongsToMany)

    Убедитесь, что вы установилитег Post HABTM и тег HABTM Post правильно сообщают.

  2. Проверьте значение $recursive

    Для большинства примеров в книге CakePHP требуется, чтобы у вас был *Свойство 1016 * установлено на 1.

  3. Снять ограничение полей: 'fields' => array('Post.*')

    Возможно, что Cake ограничивает только поля Post, поэтому нетTag поля отображаются.Снимите это ограничение и попробуйте снова.

Дайте нам знать, если это работает для вас.

...