Sql yii在保存前为自动递增指定外键值
在我的web应用程序中,我有三个表,即user、producer\u offer、consumer\u req。这种关系使得作为主键的用户表的“id”列是生产者表的“提供者”列和“消费者请求”表的“请求者”列的外键。 这是我的亲戚Sql yii在保存前为自动递增指定外键值,sql,yii,Sql,Yii,在我的web应用程序中,我有三个表,即user、producer\u offer、consumer\u req。这种关系使得作为主键的用户表的“id”列是生产者表的“提供者”列和“消费者请求”表的“请求者”列的外键。 这是我的亲戚 // user.id=producer_offer.offered_by (it should be the other way) producer_offer.offered_by=user.id; // user.id=consumer_re
// 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
现在,我希望在基于用户typeproducer创建用户记录之前,应该进行赋值,使其自动递增。ie,同时创建用户本身 我想要这样
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方法,但我已经使用它来散列用户密码。我该怎么做,谁能帮我一下。因为我是新手
我的TableU报价的结构
我的表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 | |
+--------------+-------------------------------------+------+-----+-------------------+----------------+
我已将表的结构放入其他表中,因为user_id是外键,所以必须先存在第一个用户,然后创建生产者和消费者的记录。如果您在不首先创建用户的情况下创建它们,则会导致引用完整性约束冲突。 我假设producer和consumer中的其他属性可以为null,因此它不会给出givee错误。 例如,在用户的创建操作中 应在控制器中设置“请求者”和“提供者”,以便它们不必出现在输入表单上。您需要从表单中删除该属性,并从模型中删除下面提到的行 编辑: 发生此错误是因为您试图在数据库的int-type属性中放入字符串。当您创建模型时,您请求的属性被设置为字符串类型属性。因此,当您尝试在int-type属性中插入字符串时,会发生此错误。 如果你看模型,你会看到一些顶部有@的线条。这些是模型的属性。你会把它看作是 因此,在保存模型之前,需要将字符串解析为int。 试一试
As$\u POST['User']['requested\u by']将具有当前值。int将其转换为int。赋值应自动递增。增量什么?意味着每次创建producer类型的用户时,用户id应分配给producer表的提供用户,每次创建consumer类型的用户时,用户id应分配给表的consumer表的请求用户。实际上,其他属性不为空,我应该如何修改它?实际上你不需要修改表格。相反,你应该让Producerofer和CustomerReq这样的应用程序流不是首先创建的。请在问题中显示您的表的结构,以便我可以进一步提供帮助。刚才我添加了我的表的结构,请定义您的应用程序的一些流程,因为通常先创建用户,然后再创建其他实体。您可以告诉我要先创建哪个表?要先创建消费者还是生产者,然后创建用户?首先创建用户表,然后创建其他表
+--------------+-------------------------------------+------+-----+-------------------+----------------+
| 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 | |
+--------------+-------------------------------------+------+-----+-------------------+----------------+
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();
}
}
}
}
public function rules()
{
return array(
array('requested_by', 'required'),//remove requested_by from here.
);
}
* @property string $requested_by
$model->offered_by=(int)$_POST['User']['requested_by']