我发送一个带有$ 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语句附加到每个数组对象的第一个元素。
谢谢;
答案 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