Сохранение данных в несколько таблиц из одной формы в CakePHP 2.5.1

Я новичок в CakePHP, занимаюсь разработкой облачного приложения с использованием CakePHP 2.5.1 и MySQL. у меня есть следующие таблицы:

users

  user_id ,
  people_id(FK- people.people_id),
  username,
  password

people

  people_id, 
  manager_id(FK- people.people_id), 
  firsr_name,
  last_name,

roles

  role_id ,
  people_id (FK- people.people_id),
  role

addresses

  address_id,
  people_id (FK- people.people_id),
  street,
  house no,
  post code,
  city

Иностранный ключ people.manager_id ссылается на primary_key people.people_id, Поле roles.role может держать либо 'manager' или же 'customer',

Теперь в моей регистрационной форме будут поля ввода:

-username
-password
-first name
-last name
-street
-house no
-post code
-city
-role     

Я использовал модель User (User.php), форму регистрации (add.ctp) и контроллер (UsersController.php) для ввода имени пользователя и пароля; и реализованы вход в систему, выход из системы.

Вид add.ctp:

<div class="users form">
<?php echo $this->Form->create('User'); ?>
    <fieldset>
        <legend><?php echo __('Registrierung'); ?></legend>

        <?php echo $this->Form->input('username');

              echo $this->Form->input('password');
              echo $this->Form->input('password_confirm', array('label' => 'Confirm Password', 'maxLength' => 255, 'title' => 'Confirm password', 'type'=>'password'));


        );  
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Register')); ?>
</div>

работает нормально. Теперь мне нужно включить вышеуказанные поля ввода в регистрационную форму. Это означает создание моделей для каждой таблицы и определение таких ассоциаций, как belogsTo, hasMany и т. д. в моем User В модели я определил следующую связь:

class User extends AppModel {

    public $belongsTo = array(
            'Person' => array(
                'className' => 'Person',
                'foreignKey' => 'people_id'

            )
    );
}

Однако он выдает следующую ошибку:

Database Error
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Person.id' in 'on clause' 

Может кто-нибудь сказать мне, как реализовать эти ассоциации? Я не смог найти ни одного примера, который бы соответствовал моим требованиям.

2 ответа

Решение

Ошибка MySQL вызвана тем, как вы назвали свои первичные ключи. В CakePHP первичные ключи должны быть названы id,

Если вы хотите использовать другое имя (не рекомендуется), вы должны сообщить CakePHP, какое имя вы будете использовать. Это сделано, объявив $primaryKey имущество. Пример:

class Person extends AppModel {

    public $primaryKey = 'people_id';

}

Тем не менее, желательно, чтобы вы переименовали свои первичные ключи и в максимально возможной степени придерживались соглашений CakePHP.

Кроме того, кстати, CakePHP обрабатывает множественное число, ваш people_id поля должны быть переименованы в person_id,

РЕДАКТИРОВАТЬ: Добавление отношений

Ваши отношения могут быть следующими.

Ваш Person учебный класс:

class Person extends AppModel{

    public $belongsTo = array(
        'Manager' => array(
            'className' => 'Person',
            'foreignKey' => 'manager_id',
        ),
    );

    public $hasMany = array(
        'User',
        'Role',
        'Address',
        'Subordinate' => array(
            'className' => 'Person',
            'foreignKey' => 'manager_id',
        ),
    );
}

Ваши другие классы:

class User extends AppModel{

    public $belongsTo = array(
        'Person'
    );
}

class Role extends AppModel{

    public $belongsTo = array(
        'Person'
    );
}

class Address extends AppModel{

    public $belongsTo = array(
        'Person'
    );
}

Не забудьте изменить все внешние ключи от people_id в person_id,


Модификация в модели Role

Я думаю, что вы можете переместить поле roles.person_id в people.role_id, ИМХО это имеет больше смысла.

Ваши отношения изменятся на:

class Person extends AppModel{

    public $belongsTo = array(
        'Manager' => array(
            'className' => 'Person',
            'foreignKey' => 'manager_id',
        ),
        'Role'
    );

    public $hasMany = array(
        'User',
        'Address',
        'Subordinate' => array(
            'className' => 'Person',
            'foreignKey' => 'manager_id',
        ),
    );
}

а также

class Role extends AppModel{

    public $hasMany = array(
        'Person'
    );
}

Увидеть

Вы можете явно определить первичный ключ в каждой из моделей, но это усложняет задачу.

Я бы порекомендовал вам придерживаться конвенций. Пожалуйста, измените все поля первичного ключа на "id". Это, вероятно, решит большую часть ваших проблем.

Мир! XD

Другие вопросы по тегам