#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, так что, возможно, в этом и заключается путаница.