将多个关联实体保存在Cakephp中

时间:2017-09-21 02:14:40

标签: php cakephp

我订单保存,但每个订单的多个订单行(产品和总价,数量)不与订单一起保存。

以下是此阶段的日志转储:

$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'
                        ]);
                    ?>

和订单线循环中的表单:

Orderlines.

现在我已经在没有order{ id, x, y, orderlines[[0]{OL1...}[1]{OL2}] } 的情况下尝试了它,并尝试单独保存每个订单行,但它不会保存订单ID和内容。

我只想一次性保存它。类似的东西:

    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)

所以我可以在订单中包含尽可能多的订单,并且每次都将它们保存在一起。我想我只是缺少一个小语法的东西,但也许我不是。

tup = ('h','e',4)
map_str = map(str, tup)
print(''.join(map_str))

感谢。

1 个答案:

答案 0 :(得分:0)

所以我得到了2个答案。第一个是真正混乱但工作的解决方案,以及我后来发现的解决方案。

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']]);