如何使用hasOne绑定获取HABTM关联数据

时间:2010-12-31 02:25:10

标签: php cakephp has-and-belongs-to-many has-one

我正在关注http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

中记录的示例

我正在尝试使用hasOne检索关联数据。

我创建了3个表帖子,标签和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 :(得分:0)

我建议检查3件事:

  1. 看看你是否设置好了 协会权利(hasManyhasAndBelongsToMany

    确保您已正确设置发布HABTM标记和标记HABTM帖子关系。

  2. 检查值 $recursive

    CakePHP手册中的大多数示例都要求您将$recursive属性设置为1.

  3. 删除字段 限制:'fields' => array('Post.*')

    Cake可能仅限制Post字段,这就是为什么没有Tag字段出现的原因。删除此限制并再次尝试。

  4. 请告诉我们这是否适合您。