如何在yii2 restful服务中处理发布数据?

时间:2016-05-16 13:23:29

标签: php angularjs rest yii2

我发送一个带有$ htpp帖子的数组,如:

var results = services.transaction('orderdetails/insert',
                       {customer_id: $scope.order.customer_id, data: $scope.orderDetail});

其中$ scope.orderdetail是从ui_grid中检索的数据数组:

            $scope.orderDetail = [];

            for (var i = 0; i < gridLength; i++) {
                $scope.orderDetail.push({
                "product_id": $scope.grid[i].product.id,
                "quantity": $scope.grid[i].quantity,
                "custom_price": $scope.grid[i].price
            });

        } 

并在我的actionInsert()中处理它:

public function actionInsert() {
    $request = Yii::$app->request;
    $customer_id = $request->getBodyParam('customer_id');
    $data = $request->getBodyParam('data');
}

问题是当我尝试迭代时,数组$ data没有键 它在我的actionInsert中。但是当我返回它时,我将这些数据作为响应,告诉它是一个数组:

data:Array[2]
0: Object
custom_price: 5000
product_id: 4
quantity: 6
1: Object
custom_price: 8000
product_id: 2
quantity: 8

我的目标是使用事务插入这些数据,遵循以下步骤:

1-按表格顺序插入customer_id

2 - 获取最后一个订单ID以将其插入orderdetails

3-插入其他值的数组,但我希望在每个插入中添加订单ID。

我这样做了:

    $sql1 = "insert into `order`(customer_id) values($customer_id);";
    $sql2 = 'select @orderNumber := max(id) from `order`;';

//**Transaction**//
    $connection = Yii::$app->db;
    $transaction = $connection->beginTransaction();
    try {
        $connection->createCommand($sql1)->execute();
        $connection->createCommand($sql2)->execute();

            $connection->createCommand("INSERT INTO `orderdetails` (oder_id, product_id, quantity, custom_price) "
                    . "VALUES (@orderNumber, $values")->execute();


        $transaction->commit();
    } catch (Exception $e) { // an exception is raised if a query fails
        $transaction->rollback();
    }
    //**end transaction

我知道我必须使用这样的东西:

foreach( array_keys($data) as $key ) {

        $fields[] = "`$key`";
        $values[] = "'" . \Yii::$app->db->quoteValue($data[$key]) . "'";

}
$fields = implode(",", $fields);
$values = implode(",", $values);

但正如我之前提到的那样,我的$ data有意外的键0,1等,但是我需要custom_price和其他。为什么数组不是预期的,以及如何将带有@orderNumber的insert语句附加到每个数组对象的第一个元素。

谢谢;

1 个答案:

答案 0 :(得分:1)

<强>解决:

$sql1 = "insert into `order`(customer_id) values($customer_id);";
    //**Transaction**//
    $connection = Yii::$app->db;
    $transaction = $connection->beginTransaction();
    try {
        $connection->createCommand($sql1)->execute();

        $orderNumber = Yii::$app->db->getLastInsertID();
        foreach ($data as $value) {
            $model = new Orderdetails;
            $model->order_id = $orderNumber;
            $model->attributes = $value;
            if (!$model->save()) {
                throw new Exception('Insertion failed');
            }
        }
        //.... other SQL executions
        $transaction->commit();
    } catch (Exception $e) { // an exception is raised if a query fails
        $transaction->rollback();
    }
    //**end transaction