-2

Cake php でデータを保存する際に少し問題が発生しました。

ここにモデル/関係があります。

  • 地区には多くの部門があります
  • 部門には多くのグループがあります

ユーザーが複数の新しい部門を作成できるように、新しい地区を作成することを検討しています。各部門を作成する際に、ユーザーはその部門に対して複数のグループを作成できます。問題は、グループ データを保存する方法がわからないことです。

その場で作成される部門ごとに、入力に複数のインデックス メソッド (つまり、「Department.0.name」、Department.0.type) を使用するので、saveAll メソッドを使用して簡単に保存できます。ただし、作成される各グループには、department_id が必要です。District の部門はまだ保存されていないため、ID はありません。この新しい学区のデータを保存し、新しい部門と関連する新しく作成されたグループを保存するにはどうすればよいですか? たとえば、「Department.0.Group.0.name」のような適切な関連付けを作成するグループ入力の名前属性に対処する方法はありますか?

前もって感謝します!!!ご不明な点がございましたら、遠慮なくおっしゃってください。喜んで書き直します。

4

1 に答える 1

2

POST データ配列はどのように見えますか?

<?php

debug($this->data);

?>

正しい形式でない場合、関連付けられたモデルは保存されません.Cake は、まだ保存されていないモデルの「lastInsertId()」を取得することを認識しているため、それらについて心配する必要はありません。 ...私が確信していないこと、およびドキュメントが実際に行っていないことは、保存がどれだけ深いかです。提供される例は次のとおりです。

$this->data =
Array
(
    [Article] => Array
        (
            [title] => My first article
        )
    [Comment] => Array
        (
            [0] => Array
                (
                    [comment] => Comment 1
                    [user_id] => 1
                )
            [1] => Array
                (
                    [comment] => Comment 2
                    [user_id] => 2
                )
       )
)

$this->Article->saveAll($this->data);

これは、「hasMany」関係の関連付けられたモデルを保存するための正しい構造 (cakephp 1.3) ですが、1 つの子よりも深くなるかどうかはわかりません。

私の頭に浮かぶことの 1 つは、上記の形式に従って配列を構築することですが、親モデルは除外します。次に、親モデル データを手動で保存し、::getLastInsertId(); を取得します。次に、部門とグループに対して saveAll を実行します。


[更新] あなたの理論をテストしたところ、意図したとおりに機能します。

<?php

echo $this->Form->input('Department.0.Group.0.name');

?>

生産します:

<input name="data[Department][0][Group][0][name]" type="text" id="Department0Group0name">

[更新 2 ] lib/Cake/Model/Model.php をいくつか調べたところ、次のことがわかりました。

<?php
...

public function saveAssociated($data = null, $options = array()) {
    ...
    ... // code omitted.
    ...
    if ($options['deep']) {  // This will recurse infinitely through all associations
        $saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false)));
    }
    ...
    ...
    ... // code omitted.
...
?>
于 2013-03-27T02:36:45.890 に答える