Сохранение данных в несколько таблиц из одной формы в 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'
);
}
Увидеть
- Поваренная книга 2.x: условные обозначения модели и базы данных
Вы можете явно определить первичный ключ в каждой из моделей, но это усложняет задачу.
Я бы порекомендовал вам придерживаться конвенций. Пожалуйста, измените все поля первичного ключа на "id". Это, вероятно, решит большую часть ваших проблем.
Мир! XD