Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一次性保存多个关联实体_Php_Cakephp - Fatal编程技术网

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
。我确信这是一件很小的事情!