CakePHP 2.0 - Как удалить объединяемые таблицы из содержимого - PullRequest
0 голосов
/ 31 октября 2011

Я использую 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 в представлении. Проблема в том, что данные содержат дополнительный массив «GroupsUser», вложенный в мой массив «Groups». Пользователям Api не нужно знать информацию об объединяемой таблице, поэтому я хотел бы удалить ее. Токовый выход выглядит так:

index.ctp

<?php
    //debug($users);

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

вывод index.ctp -> http://www.pastie.org/2789367

См. Тег GroupsUser, вложенный в тег Group? Это то, что я хочу удалить. Если нет простого способа сделать это, я либо создам xml вручную, используя несколько циклов в представлении, либо создаю свой собственный метод find в модели и использую unset () в GroupsUser. Оба эти решения не идеальны, поэтому я надеюсь, что у кого-то здесь есть лучшее решение. :)

1 Ответ

0 голосов
/ 01 ноября 2011

Если вы уверены, что все выполняется в объединении (принадлежит только ассоциациям), вы можете использовать содержащийся компонент с автоматическими полями в false как-то так

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

(это для того, чтобы прикрепить его динамически в части контроллера.

если ваша находка имеет ассоциацию hasMany, у вас будет 2 запроса вместо, так что торт должен выбрать эти поля для объединения. Вы также можете использовать связываемый компонент для этого случая, который помещает все в объединения вместо большого количества запросов, что дает вам возможность выбрать только те поля, которые вы хотите.

вот ссылка для связываемого компонента

...