1

次のモデルがあるとします。

Order hasMany OrderLine   (OrderLine belongsTo Order)
OrderLine hasOne Product  (Product belongsTo OrderLine)

各 OrderLine が 1 つの Product を持つ多くの OrderLines を持つ新しい Order を保存したいと考えています。例: ユーザーが「PS3」と「XBOX」を購入したい場合、データベースは次のようになります。

orders
+----+-------- +
| id | user_id |
+--------------+
| 1  | 10      |

orders_line
+------+----------+------------+
| id   | order_id | product_id |
+-----------------+------------+
| 100  |   1      |   1001     |
| 101  |   1      |   1002     |

products
+-------+------+
| id    | name | ...
+--------------+
| 1001  | PS3  |
| 1002  | BOX  |

Order と OrderLines を保存できますsaveAll

OrdersController.php

  public function add() {
     if ($this->request->isPost()) {
        $this->Order->create();
        $this->request->data['Order']['user_id'] = $this->Auth->user('id');
        $this->Order->saveAll($this->request->data);
     }
  }

それはうまくいきます。しかし、製品要素を保存する方法がわかりません。

私のフォーム:

<form ...>
<div id="order-lines">
   <div>
      <input name="data[OrderLine][0][user_id]" type="hidden">
      <div class="span3">
         <label>myfield/label>
         <input name="data[Product][0][myfield]" type="text" id="Product0Myfield">
      </div>
      <div>
         <label>fieldb</label>
         <input name="data[Product][0][fieldb]" type="text" id="Product0Fieldb">
      </div>

   <div>
      <input name="data[OrderLine][1][id]" type="hidden">
      <div>    
         <input name="data[Product][1][id]" type="hidden">
         <label>myfield</label>
         <input name="data[Product][1][myfield]" type="text" id="Product1Myfield">
      </div>

      <div class="span3">
         <label>fieldb</label>
         <input name="data[Product][1][fieldb]" type="text" id="Product1Fieldb">
      </div>
    </div>
</div>
</form>

私はこれを試しました:

foreach ($this->request->data['OrderLine'] as &$orderLine) {
    // create the product and populate it with form data
    $this->Product->create();
    $this->Product->save($this->request->data);
    // trying to update the OrderLine foreign key
    $orderLine['product_id'] = $this->Product->id; // doesn't works 
}

どんな助けでも大歓迎です。

4

2 に答える 2

1

私の解決策、フィードバックは大歓迎です。

OrdersController.phpは使用しませんsaveAll

  public function add() {
     if ($this->request->isPost()) {
        $this->Order->create();
        $this->request->data['Order']['user_id'] = $this->Auth->user('id');
        $this->Order->save($this->request->data);
        $i = 0;
        foreach ($this->request->data['OrderLine'] as &$orderLine) {
           $this->OrderLine->create();
           $this->OrderLine->set('order_id', $this->Order->id);
           $this->Product->create();
           $this->Product->save($this->request->data['OrderLine'][$i]['Product'][$i]);
           $this->OrderLine->set('product_id', $this->Product->id);
           $this->OrderLine->save($this->request->data['OrderLine']);
           $i++;
        }
        $this->redirect(array(
           'controller' => 'sites',
           'action' => 'index'
        ));
     }
  }

そして、私のフォームは、実際には JavaScript を使用してフォームを生成しました。

$(function() {
    var i = 0;
    $('#new-order-line').click(function() {
        $(
        '<div class="row-fluid">' +
            '<div class="span3">' +                                                                                                   
                '<input name="data[OrderLine][' + i + '][user_id]" type="hidden"/>' +
                '<input name="data[OrderLine][' + i + '][product_id]" type="hidden"/>' +
                '<label>FieldA</label>' +
                '<input name="data[OrderLine][' + i + '][Product][' + i + '][field_a]" type="text" id="OrderLine' + i + 'ProductFielda"/>' +
            '</div>' + 
            '<div class="span3">' +
                '<label>FieldB</label>' +
                '<input name="data[OrderLine][' + i + '][Product][' + i + '][field_b]" type="text" id="OrderLine' + i + 'ProductFieldb"/>' +
            '</div>' + 
        '</div>'
        ).fadeIn('slow').appendTo('#order-lines');
        $('.oculto').removeAttr('disabled');
        ++i;
    });
});

data[OrderLine][i]フォームの変更点: Product 入力に を追加しました。

于 2013-01-18T12:39:38.223 に答える
1

次のようなものを使用できるはずです。

Array
(
    [0] => array(
        [Order] => Array
        (
            [user_id] => 10
        )

        [OrderLine] => array(
            [0] => array
            (
                [product_id] => 1001
            )
            [1] => array
            (
                [product_id] => 1002
            )
        )
    [1] => array(...)
)

つまり、フォームは次のようになります。

data[0][Order][user_id]
data[0][OrderLine][0][product_id]
data[0][OrderLine][1][product_id]

data[1][Order][user_id]
data[1][OrderLine][0][product_id]
data[1][OrderLine][1][product_id]

等々...

オプションを使用して 1 回の呼び出しですべてを保存しますarray('deep' => true)( http://book.cakephp.org/2.0/en/models/ Saving-your-data.html #model-savemany-array-data-null-array-options-array を参照) 。またはループで:

foreach ($this->request->data as $data)
    $this->Order->saveAll($data)
于 2013-01-18T14:28:12.853 に答える