在 CakePHP 2.5.1 中将数据从一个表单保存到多个表中
Saving data into multiple tables from one form in CakePHP 2.5.1
我是 CakePHP 的新手,正在使用 CakePHP 2.5.1 和 MySQL 开发云应用程序。我有以下 tables:
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_keypeople.people_id
。字段 roles.role
可以包含 'manager'
或 'customer'
.
现在,在我的注册表中,将有以下输入字段:
-username
-password
-first name
-last name
-street
-house no
-post code
-city
-role
我使用了用户模型(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>
工作正常。现在我需要在注册表中包含上述输入字段。这意味着为每个 table 创建模型并定义关联,如 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'
谁能告诉我如何实现这些关联?我找不到任何符合我要求的示例。
MySQL 错误是由您命名主键的方式引起的。在 CakePHP 中,主键应该命名为 id
。
如果您想使用不同的名称(不推荐),您必须告诉 CakePHP 您将使用什么名称。这是通过声明 $primaryKey
属性 完成的。示例:
class Person extends AppModel {
public $primaryKey = 'people_id';
}
但是,您最好重命名主键并尽可能遵守 CakePHP 约定。
此外,按照 CakePHP 处理复数的方式,您的 people_id
字段应重命名为 person_id
。
编辑:添加关系
你们的关系可能如下。
你的Person
class:
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是:
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
我是 CakePHP 的新手,正在使用 CakePHP 2.5.1 和 MySQL 开发云应用程序。我有以下 tables:
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_keypeople.people_id
。字段 roles.role
可以包含 'manager'
或 'customer'
.
现在,在我的注册表中,将有以下输入字段:
-username
-password
-first name
-last name
-street
-house no
-post code
-city
-role
我使用了用户模型(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>
工作正常。现在我需要在注册表中包含上述输入字段。这意味着为每个 table 创建模型并定义关联,如 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'
谁能告诉我如何实现这些关联?我找不到任何符合我要求的示例。
MySQL 错误是由您命名主键的方式引起的。在 CakePHP 中,主键应该命名为 id
。
如果您想使用不同的名称(不推荐),您必须告诉 CakePHP 您将使用什么名称。这是通过声明 $primaryKey
属性 完成的。示例:
class Person extends AppModel {
public $primaryKey = 'people_id';
}
但是,您最好重命名主键并尽可能遵守 CakePHP 约定。
此外,按照 CakePHP 处理复数的方式,您的 people_id
字段应重命名为 person_id
。
编辑:添加关系
你们的关系可能如下。
你的Person
class:
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是:
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