Sql yii在保存前为自动递增指定外键值

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

在我的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_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']