yii在保存之前为自动增量分配外键值

时间:2014-02-09 13:49:23

标签: sql yii

在我的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()方法,但我已经用它来散列用户密码。我该怎么办,有人帮我这个。因为我是新手。

我的表格(producer_offer)

的结构
--------------------+------------------+------+-----+-------------------+----------------+
| 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              |                |
+--------------+-------------------------------------+------+-----+-------------------+----------------+

我把表格的结构放在了

1 个答案:

答案 0 :(得分:0)

由于user_id是其他表中的外键,因此必须存在第一个用户,然后创建producerconsumer的记录。如果您在不先创建用户的情况下创建它们,那么它将提供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_byoffered_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。