Контроллер может просматривать связанное поле, но не отображает его в действии добавления или редактирования

#php #mysql #cakephp #orm #cakephp-2.5

#php #mysql #cakephp #orm #cakephp-2.5

Вопрос:

Привет разработчикам CakePHP,

CakePHP 2.5.2

У меня есть база данных с Agreements таблицей. Оно относится к таблицам для взрослых, детей, групп, цен и курсов.

Мой контроллер имеет 3 действия: index , add и edit . Первый, index , работает нормально, отображает все связанные таблицы на одной странице. Но проблема связана с действиями edit и add .

У моего контроллера есть массивы со связанными данными, и в его массивах нет реальных имен детей, взрослых, групп и так далее. Только числа 1,2,3 и т.д.

Мой AgreementsController.php отправляет ли данные для просмотра с помощью этих команд:

 $this->Agreement->recursive = 1;
$adults = $this->Agreement->Adult->find('list');
$childrens = $this->Agreement->Children->find('list');
$groups = $this->Agreement->Group->find('list');
$prices = $this->Agreement->Price->find('list');
$courses = $this->Agreement->Course->find('list');
$this->set(compact('adults', 'childrens', 'groups', 'prices', 'courses'));
  

Я думаю, что в этих массивах $adults, $ children есть только числа. Почему они не извлекают реальные номера элементов. Мои соглашения / add.ctp:

 <?php echo $this->Form->create('Agreement'); ?>

    <?php
        echo $this->Form->input('date_of_agreement');
        echo $this->Form->input('number');
        echo $this->Form->input('year');
        echo $this->Form->input('adult_id', array (                      
                        'type' => 'select', 
                        'options' => $adults 
                        ) 
                );
                print_r($adults);
        echo $this->Form->input('children_id');
        echo $this->Form->input('status_id');
        echo $this->Form->input('city_id');
        echo $this->Form->input('price_id');
        echo $this->Form->input('course_id');
        echo $this->Form->input('group_id');
    ?>

<?php echo $this->Form->end(__('Submit')); ?>
  

Даже добавление параметра ‘options’ не решает проблему.
Я потратил на это 50 часов, и я не знаю, почему?

Я проверил массив, он выглядит так: Array ( [1] => 1 [2] => 2 )

Можете ли вы помочь мне с этим?

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

1. Почему в вопросе указан код индекса? если ваша проблема заключается в том, что (например) $adults является числовым массивом, не имеет значения , как вы ссылаетесь на эту переменную, она будет числовой. Важно то, какое поле отображения для моделей, для которых вы вызываете find list . Перефразируя ваш вопрос, это Why is this a numeric array: $adults = $this->Agreement->Adult->find('list'); <- сократите свой вопрос, чтобы включить только то, что имеет отношение к делу, пожалуйста.

2. Большое вам спасибо за помощь. Я не знал, что включить в вопрос.

3. Вместо массива ([1] => 1 [2] => 2) вам нужен, например, массив ([1] => ‘Tomas’ [2] => ‘Anna’)?

4. ДА. Например, в таблице соглашений есть Children_id, он содержит число, например 1,2,3,4. В дочерней таблице есть [‘Children’][‘first_name’] . Я хочу показать array Children_id => [‘first_name’] и т.д.

5. [code] СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ agreements ( id int(11) NOT NULL АВТО_ИНКРЕМЕНТ, ………. adult_id int(11) ПО УМОЛЧАНИЮ NULL, children_id int(11) NOT NULL, status_id int(11) NOT NULL, city_id int(11) NOT NULL, price_id int(11) ПО УМОЛЧАНИЮNULL, course_id int(11) ПО УМОЛЧАНИЮ NULL, group_id int(11) ПО УМОЛЧАНИЮ NULL, PRIMARY KEY ( id ) ) ENGINE=InnoDB КОДИРОВКА ПО УМОЛЧАНИЮ=latin1 AUTO_INCREMENT=2 ; [/code]

Ответ №1:

В ваших таблицах db переименуйте поля:

  • имя_персонала для взрослых> имя_персонала,
  • adult_last_name> last_name,
  • имя_первого_имя_первого_имя_первого_имя,
  • имя_детского_постоянства> last_name,
  • группа> имя

В ваших моделях создавайте виртуальные поля:

 public $virtualFields = array(
'name' => "CONCAT(Adult.first_name, ' ', Adult.last_name)"
);
  

очистить кэш и протестировать.

Редактировать

Или вы можете в своем методе find list добавить параметры, например:

 $adults = $this->Agreement->Adult->find('list',array(
        'fields'=>array('Adult.id','Adult.first_name')
        ));
  

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

1. переименование полей, хотя и хороший совет, не является основополагающим для ответа. Важным моментом является то, что если список полей не передается в вызов find list, используются первичный ключ модели и поле отображения, которое по умолчанию имеет значение primary key fieldname , что приводит к массиву pk => pk .