在我的Web应用程序中,我有三个表,即user,producer_offer,consumer_req。这种关系使得作为主键的用户表的“id”列是producer表的'provided_by'列的外键,'consumer_req'表的'requested_by'列。 这是我的关系
// user.id=producer_offer.offered_by (it should be the other way)
producer_offer.offered_by=user.id;
// user.id=consumer_req.requested_by(it should be the other way)
cpnsumer_req.requested_by=user.id
现在我希望以这样的方式在根据用户类型(生产者,消费者)创建用户记录之前,应该进行分配以使其自动递增。即,在创建用户本身时 我想要这样
producer=new ProducerOffer
consumer=new ConsumerReq
if(user->type==producer){
user->id=ProducerOffer.offered_by
}
if(user->type==consumer){
user->id==ConsumerReq.requested_by
}
我该怎么办?我知道我可以使用beforeSave()方法,但我已经用它来散列用户密码。我该怎么办,有人帮我这个。因为我是新手。
--------------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+------------------+------+-----+-------------------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| requested_by | int(11) unsigned | NO | MUL | NULL | |
| requested_vegetable | int(3) | NO | MUL | NULL | |
| requested_qty | decimal(4,2) | NO | | NULL | |
| requested_date | timestamp | NO | | CURRENT_TIMESTAMP | |
+---------------------+------------------+--
我的表consumer_req的结构
+---------------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+------------------+------+-----+-------------------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| requested_by | int(11) unsigned | NO | MUL | NULL | |
| requested_vegetable | int(3) | NO | MUL | NULL | |
| requested_qty | decimal(4,2) | NO | | NULL | |
| requested_date | timestamp | NO | | CURRENT_TIMESTAMP | |
+---------------------+------------------+------+-----+-------------------+----------------+
用户表
+--------------+-------------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------------------------------+------+-----+-------------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| user | varchar(45) | NO | UNI | NULL | |
| email | varchar(60) | NO | UNI | NULL | |
| pass | char(64) | NO | | NULL | |
| user_type | enum('producer','consumer','admin') | NO | | NULL | |
| date_entered | timestamp | NO | | CURRENT_TIMESTAMP | |
| phone_number | varchar(18) | NO | UNI | NULL | |
| street | varchar(30) | NO | | NULL | |
| district | varchar(30) | NO | | NULL | |
| state | varchar(30) | NO | | NULL | |
| postal_code | int(20) | NO | | NULL | |
+--------------+-------------------------------------+------+-----+-------------------+----------------+
我把表格的结构放在了
答案 0 :(得分:0)
由于user_id是其他表中的外键,因此必须存在第一个用户,然后创建producer
和consumer
的记录。如果您在不先创建用户的情况下创建它们,那么它将提供refrential完整性约束违规。
我假设生产者和消费者中的其他属性是可空的,所以它不会给出错误
例如,在用户的创建动作中。
public actionCreate()
{
if(isset($_POST['User']))
{
$model->attributes=$_POST['User'];
if($model->save())
{ if($model->type=='producer'){
$producer=new ProducerOffer();
$producer->offered_by=$model->id;
//similar for other attributes of producer
$producer->save();
}
if($model->type=='consumer'){
$consumer=new ConsumerReq();
$consumer->requested_by=$model->id;
//similar for other attributes
$consumer->save();
}
}
}
}
因为requested_by
和offered_by
应该在控制器中设置,所以它们不需要在输入表单上。您需要从表单中删除该属性,并从模型中删除下面提到的行
public function rules()
{
return array(
array('requested_by', 'required'),//remove requested_by from here.
);
}
修改强>
发生此错误是因为您尝试将字符串放在数据库的int类型属性中。当您创建模型时,您的属性requested_by
以某种方式设置为字符串类型属性。因此,当您尝试在int
类型属性中插入字符串时,会发生此错误
如果你看一下模型,你会在顶部看到一些@
的行。这些是您的模型的属性。你会看到as
* @property string $requested_by
因此,在保存模型之前,需要将字符串解析为int
尝试
$model->offered_by=(int)$_POST['User']['requested_by']
由于$ _POST ['User'] ['requested_by']将具有当前值。和int将它转换为int。