Php 一次性保存多个关联实体
我有一个可以保存的订单,但是每个订单的多个订单行(一个产品和总价、数量)没有与订单一起保存Php 一次性保存多个关联实体,php,cakephp,Php,Cakephp,我有一个可以保存的订单,但是每个订单的多个订单行(一个产品和总价、数量)没有与订单一起保存 public function addAllFromCart($order_id) { $success = true; $cart_items = $this->getCartItemsArray(); $saved_ids = []; foreach ($cart_items as $cart) {
public function addAllFromCart($order_id)
{
$success = true;
$cart_items = $this->getCartItemsArray();
$saved_ids = [];
foreach ($cart_items as $cart) {
$this->log($cart);
$orderline = $this->makeEntity($order_id, $cart);
$new = $this->Orderlines->save($orderline);
if ($new) {
$this->log('Line saved');
array_push($saved_ids, $new->id);
} else {
$this->log('Line save FAILED');
$success = false;
//if there is a failure, we need to delete the lines that we made - there is a better way, but cake sucks and conventions don't work
foreach ($saved_ids as $id_to_delete) {
$d = $this->Orderlines->get($id_to_delete);
$this->Orderlines->delete($d);
}
}
}
$this->log('WAS ADD ALL FROM CART A SUCCESS? -- ' . $success);
// if ($success) {
// return $this->redirect($this->referer());
// } else {
// return $this->redirect($this->referer());
// }
return $success;
}
`
以下是此阶段的日志转储:
{ "associated": [ "Orderlines", "Payments" ], "Orderlines": [ { "total_cost": "222.44", "total_quantity": "2", "product_variants_id": "34" }, { "total_cost": "154", "total_quantity": "2", "product_variants_id": "33" } ], "users_id": 1, "usersaddress_id": 1, "orderstatus": 0, "date": "2017-09-21T01:53:38+00:00", "last_modified": "2017-09-21T01:53:38+00:00" }
控制器:
$associated = ['Orderlines', 'Payments'];
$order = $this->Orders->newEntity(['associated'=>$associated]);
if ($this->request->is('post')) {
$order = $this->Orders->patchEntity($order, $this->request->getData());
$order->users_id = $this->Auth->user('id');
//Hardcoded the SHU MART stores location because thats all thats gonna get implemented for now
$order->usersaddress_id = 1;
$order->orderstatus = 0;
$order->date = Time::now();
$order->last_modified = Time::now();
//god this is ugly. forgive me for i have sinned
$order->setDirty('users_id', true);
$order->setDirty('usersaddress_id', true);
$order->setDirty('date', true);
$order->setDirty('last_modified', true);
$order->setDirty('orderlines', true);
if ($this->Orders->save($order)) {
$this->Flash->success(__('The order has been saved.'));
return $this->redirect(['controller'=>'orderlines','action' => 'index']);
}
$this->Flash->error(__('The order could not be saved. Please, try again.'));
}
以及订单行循环中的表单:
<?php
echo $this->Form->control('Orderlines.'.$orderLineIndex.'.total_cost',
['label'=>'', 'value'=>$product_total
, 'type'=>'hidden'
]);
?>
<?php
echo $this->Form->control('Orderlines.'.$orderLineIndex.'.total_quantity',
['label'=>'', 'value'=>$item['quantity']
, 'type'=>'hidden'
]);
?>
<?php
echo $this->Form->control('Orderlines.'.$orderLineIndex.'.product_variants_id',
['label'=>'', 'value'=>$item['id']
, 'type'=>'hidden'
]);
?>
因此,我可以在一个订单中有尽可能多的订单行,并且每次都将它们保存在一起。我想我只是错过了一个小的语法问题,但也许我没有
public 'associated' =>
array (size=2)
0 => string 'Orderlines' (length=10)
1 => string 'Payments' (length=8)
public 'orderlines' =>
array (size=3)
0 =>
object(App\Model\Entity\Orderline)[349]
public 'total_cost' => float 40.28
public 'total_quantity' => int 1
public 'product_variants_id' => int 679
public '[new]' => boolean true
public '[accessible]' =>
array (size=2)
...
public '[dirty]' =>
array (size=3)
...
public '[original]' =>
array (size=0)
...
public '[virtual]' =>
array (size=0)
...
public '[errors]' =>
array (size=0)
...
public '[invalid]' =>
array (size=0)
...
public '[repository]' => string 'Orderlines' (length=10)
1 =>
object(App\Model\Entity\Orderline)[375]
public 'total_cost' => float 66
public 'total_quantity' => int 2
public 'product_variants_id' => int 55
public '[new]' => boolean true
public '[accessible]' =>
array (size=2)
...
public '[dirty]' =>
array (size=3)
...
public '[original]' =>
array (size=0)
...
public '[virtual]' =>
array (size=0)
...
public '[errors]' =>
array (size=0)
...
public '[invalid]' =>
array (size=0)
...
public '[repository]' => string 'Orderlines' (length=10)
2 =>
object(App\Model\Entity\Orderline)[347]
public 'total_cost' => float 222.44
public 'total_quantity' => int 2
public 'product_variants_id' => int 34
public '[new]' => boolean true
public '[accessible]' =>
array (size=2)
...
public '[dirty]' =>
array (size=3)
...
public '[original]' =>
array (size=0)
...
public '[virtual]' =>
array (size=0)
...
public '[errors]' =>
array (size=0)
...
public '[invalid]' =>
array (size=0)
...
public '[repository]' => string 'Orderlines' (length=10)
public 'users_id' => int 1
public 'usersaddress_id' => int 1
public 'orderstatus' => int 0
public 'date' =>
object(Cake\I18n\Time)[327]
public 'time' => string '2017-09-27T21:12:38+10:00' (length=25)
public 'timezone' => string 'Australia/Melbourne' (length=19)
public 'fixedNowTime' => boolean false
public 'last_modified' =>
object(Cake\I18n\Time)[350]
public 'time' => string '2017-09-27T21:12:38+10:00' (length=25)
public 'timezone' => string 'Australia/Melbourne' (length=19)
public 'fixedNowTime' => boolean false
public '[new]' => boolean true
public '[accessible]' =>
array (size=3)
'*' => boolean true
'id' => boolean false
'users_id' => boolean false
public '[dirty]' =>
array (size=7)
'associated' => boolean true
'orderlines' => boolean true
'users_id' => boolean true
'usersaddress_id' => boolean true
'orderstatus' => boolean true
'date' => boolean true
'last_modified' => boolean true
public '[original]' =>
array (size=1)
'orderlines' =>
array (size=3)
0 =>
object(App\Model\Entity\Orderline)[359]
...
1 =>
object(App\Model\Entity\Orderline)[372]
...
2 =>
object(App\Model\Entity\Orderline)[346]
...
public '[virtual]' =>
array (size=0)
empty
public '[errors]' =>
array (size=0)
empty
public '[invalid]' =>
array (size=0)
empty
public '[repository]' => string 'Orders' (length=6)
谢谢。所以我得到了两个答案。第一个是非常混乱但有效的解决方案,也是我后来发现的解决方案
if ($result) {
$orderlinescontroller = new OrderlinesController();
if ($orderlinescontroller->addAllFromCart($result->id)) {
$this->Flash->success(__('The order ' . $result->id . ' has been successfully placed'));
$this->clearUsersCart($this->Auth->user('id'));
因此,首先保存订单,然后创建需要保存多个订单的关联项目的控制器实例。然后,我创建了一个函数,用于查看购物车项目的db/session变量,以便将它们与订单一起保存
public function addAllFromCart($order_id)
{
$success = true;
$cart_items = $this->getCartItemsArray();
$saved_ids = [];
foreach ($cart_items as $cart) {
$this->log($cart);
$orderline = $this->makeEntity($order_id, $cart);
$new = $this->Orderlines->save($orderline);
if ($new) {
$this->log('Line saved');
array_push($saved_ids, $new->id);
} else {
$this->log('Line save FAILED');
$success = false;
//if there is a failure, we need to delete the lines that we made - there is a better way, but cake sucks and conventions don't work
foreach ($saved_ids as $id_to_delete) {
$d = $this->Orderlines->get($id_to_delete);
$this->Orderlines->delete($d);
}
}
}
$this->log('WAS ADD ALL FROM CART A SUCCESS? -- ' . $success);
// if ($success) {
// return $this->redirect($this->referer());
// } else {
// return $this->redirect($this->referer());
// }
return $success;
}
`
这一切都是超级混乱和不完美的,但它是有效的。我后来在重温添加产品的一部分时发现的另一个解决方案是,它如何明确地告诉save()要保存哪些关联。因此,使用了以下公式
$result=$this->Orders->save($save,['associated'=>['Orderlines']])代码>所以我得到了两个答案。第一个是非常混乱但有效的解决方案,也是我后来发现的解决方案
if ($result) {
$orderlinescontroller = new OrderlinesController();
if ($orderlinescontroller->addAllFromCart($result->id)) {
$this->Flash->success(__('The order ' . $result->id . ' has been successfully placed'));
$this->clearUsersCart($this->Auth->user('id'));
因此,首先保存订单,然后创建需要保存多个订单的关联项目的控制器实例。然后,我创建了一个函数,用于查看购物车项目的db/session变量,以便将它们与订单一起保存
public function addAllFromCart($order_id)
{
$success = true;
$cart_items = $this->getCartItemsArray();
$saved_ids = [];
foreach ($cart_items as $cart) {
$this->log($cart);
$orderline = $this->makeEntity($order_id, $cart);
$new = $this->Orderlines->save($orderline);
if ($new) {
$this->log('Line saved');
array_push($saved_ids, $new->id);
} else {
$this->log('Line save FAILED');
$success = false;
//if there is a failure, we need to delete the lines that we made - there is a better way, but cake sucks and conventions don't work
foreach ($saved_ids as $id_to_delete) {
$d = $this->Orderlines->get($id_to_delete);
$this->Orderlines->delete($d);
}
}
}
$this->log('WAS ADD ALL FROM CART A SUCCESS? -- ' . $success);
// if ($success) {
// return $this->redirect($this->referer());
// } else {
// return $this->redirect($this->referer());
// }
return $success;
}
`
这一切都是超级混乱和不完美的,但它是有效的。我后来在重温添加产品的一部分时发现的另一个解决方案是,它如何明确地告诉save()要保存哪些关联。因此,使用了以下公式
$result=$this->Orders->save($save,['associated'=>['Orderlines']])代码>关联属性默认为小写并加下划线,除非另有明确配置,即订单行!=订单行
。我担心这不起作用,我做了一些更改,现在创建了多个订单行实体并将其放入订单中。请在帖子中找到$order的var\u dump
。我确信这是一件很小的事情!除非另有明确配置,否则关联属性默认为小写和下划线,即Orderlines!=订单行
。我担心这不起作用,我做了一些更改,现在创建了多个订单行实体并将其放入订单中。请在帖子中找到$order的var\u dump
。我确信这是一件很小的事情!