CakePHP 2.0 - 如何从包含中删除连接表

时间:2011-10-31 18:23:27

标签: cakephp cakephp-2.0

我在这样的动作中使用了Containable:

public function index()
{
    $this->User->recursive = -1;
    $this->User->Behaviors->load('Containable');

    if ($this->RequestHandler->accepts('xml'))
    {
        $this->set('users', array("Users" => array("UserEntry" => $this->User->find('all',
            array(
                'fields' => array('User.id','User.username', 'User.email', 'User.created', 'User.modified'),
                'contain' => array(                        
                    'Group' => array(
                        'fields' => array('Group.id','Group.name','Group.created'),
                    )
                )
            )            
        ))));
    }
    else if ($this->RequestHandler->accepts('json'))
    {
    }
    else if ($this->RequestHandler->accepts('html'))
    {
        $this->set('users', $this->paginate());
    }
}

它获取了我需要的所有数据,但有一件事我无法弄清楚。用户和组之间存在HABTM关系,其中包含连接表users_groups。我在视图中将find('all')的输出序列化为Xml,用于REST Api。问题是数据包含嵌套在我的'Groups'数组中的额外'GroupsUser'数组。 Api的用户不需要知道连接表信息,所以我想删除它。当前输出如下所示:

index.ctp

<?php
    //debug($users);

    $xml = Xml::build($users, array('return' => 'domdocument'));
    echo $xml->saveXML();
?>

index.ctp的输出 - &gt; http://www.pastie.org/2789367

请参阅嵌套在Group标记中的GroupsUser标记?这就是我要删除的内容。如果没有一个简单的方法可以做到这一点,我将使用视图中的一些循环手动构建xml,或者在模型中创建我自己的find方法,并在GroupsUser上使用unset()。这两种解决方案都不理想,所以我希望这里的人有更好的解决方案。 :)

1 个答案:

答案 0 :(得分:0)

我确信你所有的事情都是在一个连接中完成的(只有belongsTo关联)你可以使用带有autofields的可包含组件,例如这样的

$this->Post->Behaviors->attach('Containable', array('autoFields' => false));

(这是将它动态地附加在控制器部分。

如果你的find有hasMany关联,你将有2个查询,而不是像这样的蛋糕需要获取这些字段来进行连接。您也可以在这种情况下使用可链接组件,将所有连接组件放入连接而不是大量查询,这样您就有机会只选择所需的字段。

这是linkable component

的链接