0

2 つのテーブル間に HABTM 関係があります:itemslocations、テーブルを使用してitems_locationsそれらを結合します。

items_locationsまた、もう少し多くの情報を保存します。これがスキーマです

items_locations(id, location_id, item_id, quantity)

すべてのアイテムを 1 つの場所に表示し、ユーザーがデータグリッド スタイルのインターフェイスを介して一度に複数のフィールドを編集できるページを作成しようとしています。

Location: Factory XYZ
 ___________________________
|___Item____|___Quantity___|
| Widget    |          3   |
| Sprocket  |          1   |
| Doohickey |         15   |
----------------------------

これを支援するために、次のようなコントローラーがInventoryControllerあります。

var $uses = array('Item', 'Location');  // should I add 'ItemsLocation' ?

このデータを編集するために多次元フォームを作成するにはどうすればよいですか?


編集:

Decezeが以下に説明したようにデータを取得しようとしていますが、再び問題が発生しています...

// inventory_controller.php
function edit($locationId) {

    $this->data = $this->Item->ItemsLocation->find(
        'all',
        array(
            "conditions" => array("location_id" => $locationId)
        )
    );

私がそれをすると、$this->data次のようになります:

Array (
    [0] => Array (
        [ItemsLocation] => Array (
            [id] => 16
            [location_id] => 1
            [item_id] => 1
            [quantity] => 5
        )
    )
    [1] => Array (
        [ItemsLocation] => Array (/* .. etc .. */)
    )
)
4

1 に答える 1

6

モデル内のデータを編集しない場合はItem、結合モデルのみで作業するのがおそらく最も理にかなっています。そのため、各アイテムの数量を編集するフォームは次のようになります。

echo $form->create('ItemsLocation');

// foreach Item at Location:

echo $form->input('ItemsLocation.0.id'); // automatically hidden
echo $form->input('ItemsLocation.0.quantity');

各レコードのカウンター ( .0..1.、...) を増やします。コントローラーで受信するものは次のようになります$this->data

array(
    'ItemsLocation' => array(
        0 => array(
            'id' => 1,
            'quantity' => 42
        ),
        1 => array(
            ...

その後、他のモデル レコードと同様に、これを簡単に保存できます: $this->Item->ItemsLocation->saveAll($this->data). アイテムを場所に追加することはそれほど違いはありません。idを省略して、ユーザーに を選択させるだけitem_idです。

array(
    'location_id' => 42,  // prepopulated by hidden field
    'item_id' => 1        // user selected
    'quantity' => 242
)

Item モデルのデータを編集し、同時に対応する ItemsLocation レコードと共に保存する場合は、関連モデル データの保存 (HABTM)の章に進んでください。これに注意してください:

デフォルトでは、HasAndBelongsToMany 関係を保存するとき、Cake は新しい行を保存する前に結合テーブルのすべての行を削除します。たとえば、10 人の子供が関連付けられているクラブがあるとします。次に、Club を 2 つの子で更新します。クラブには12人ではなく、2人の子供しかいません。

と:

3.7.6.5 hasAndBelongsToMany (HABTM)

unique : true (デフォルト値) の場合、レコードを更新する際に、新しいレコードを挿入する前に、ケーキは最初に外部キー テーブル内の既存の関係レコードを削除します。そのため、更新時に既存の関連付けを再度渡す必要があります。


Re: コメント/編集

FormHelper が構造化Model.0.fieldされた配列からフィールドを自動入力するのに十分なほどインテリジェントであるかどうかは、頭の中でわかりません[0][Model][field]そうでない場合は、結果を自分で簡単に操作できます。

foreach ($this->data as &$data) {
    $data = $data['ItemsLocation'];
}
$this->data = array('ItemsLocation' => $this->data);

それはあなたに正しい構造を与えるでしょうが、それは確かにあまり良くありません. 誰かがそれを行うためのもっとケーキのような方法を持っているなら、私はすべて耳を傾けます. :)

于 2009-09-04T02:33:21.410 に答える