Иерархия CakePHP, содержащая многомерный массив

#cakephp #multidimensional-array #cakephp-2.4

#cakephp #многомерный массив #cakephp-2.4

Вопрос:

Если я сделаю это:

 $cdata = $this->Party->find('first',
        array('contain' => array(
            'Person' => array(
                'Employee' => array(
                    'Volunteer'),
                'Title'))));
Debugger::dump($cdata, 10);
  

Я понимаю это:

 array(
    'Party' => array(
        'id' => '9',
        'save_bit' => true
    ),
    'Person' => array(
        'id' => '5',
        'title_id' => '1',
        'first_name' => 'bob',
        'middle_name' => '',
        'last_name' => 'brown',
        'is_active' => false,
        'date_of_birth' => '1999-07-07',
        'gender' => 'M',
        'party_id' => '9',
        'Title' => array(
            'id' => '1',
            'title' => 'Ms',
            'description' => ''
        ),
        'Employee' => array(
            'id' => '5',
            'person_id' => '5',
            'Volunteer' => array(
                'id' => '5',
                'employee_id' => '5'
            )
        )
    )
)
  

Но я действительно хочу получить это:

 array(
    'Party' => array(
        'id' => '9',
        'save_bit' => true,
        'Person' => array(
            'id' => '5',
            'title_id' => '1',
            'first_name' => 'bob',
            'middle_name' => '',
            'last_name' => 'brown',
            'is_active' => false,
            'date_of_birth' => '1999-07-07',
            'gender' => 'M',
            'party_id' => '9',
            'Title' => array(
                'id' => '1',
                'title' => 'Ms',
                'description' => ''
            ),
            'Employee' => array(
                'id' => '5',
                'person_id' => '5',
                'Volunteer' => array(
                    'id' => '5',
                    'employee_id' => '5'
                )
            )
        )
    )
)
  

Таким образом, массив следует естественной иерархии таблиц моей базы данных, а также работает с формами моего веб-сайта для сохранения и редактирования, которые я объявил следующим образом:

 echo $this->Form->input('Party.Person.first_name');
echo $this->Form->input('Party.Person.is_active');
  

Возможно ли это сделать с помощью Containable, если да, то как? Спасибо!

Комментарии:

1. Нет, это невозможно с containable. Но почему вы хотите работать против соглашений CakePHP в первую очередь, это вызовет только проблемы !? ps. пожалуйста, всегда указывайте вашу точную версию CakePHP и соответствующим образом помечайте свой вопрос.

2. Спасибо, я добавил тег version. Я хотел, чтобы массив был таким, потому что из-за того, как называются элементы управления моей формы, именно так это выглядит, когда форма отправляется контроллеру. Итак, для представления редактирования, если я отправляю подобный массив в форму, он работает нормально, однако я считаю, что если Person не инкапсулирован в иерархию участников, то это создает проблемы и не заполняет поля должным образом. Я не осознавал, что здесь я иду против соглашений. У вас есть предложения о том, как мне следует решить эту проблему? Возможно, измените способ, которым я назвал элементы управления, чтобы это было просто Person.first_name и т.д.?

Ответ №1:

Как уже упоминалось в моем комментарии, вы не можете изменить способ форматирования данных containable, они будут отформатированы в соответствии с соглашениями CakePHP в зависимости от ваших ассоциаций.

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

Предполагая, что связь есть Party hasMany Person , вы должны просто использовать Person.0.first_name в форме, таким образом, помощник может правильно заполнить поле, и при передаче в Model::saveAll() или Model::saveAssociated() CakePHP может определить, как вещи должны быть сохранены, на основе ассоциаций, определенных в ваших моделях.

См. Сохранение связанных данных модели (hasOne, hasMany, belongsTo) для получения дополнительной информации.

Комментарии:

1. Хорошо, я немного поиграл с этим, сгладив массив (удалил название party.person в форме и т.д.). К вашему сведению: на этой вечеринке есть один человек, есть один сотрудник, есть один доброволец. Я собирался создать какую-то иерархию наследования в своей базе данных. Теперь, если я сохраню все с помощью deep => true. затем таблицы, непосредственно подключенные к таблице Party, сохраняются. Но более глубокие, такие как Employee и Volunteer, этого не делают. Поэтому, чтобы сохранить таблицы, не подключенные непосредственно к Party, кажется, мне нужно, чтобы массив находился в иерархии с Party наверху. В противном случае мне нужно было бы использовать транзакционные сохранения.

2. Однако я, вероятно, также могу сохранить, не помещая все в Party, так что, возможно, в этом и заключается путаница.