0

このような配列を保存しようとしています

$myData = array(
    'User' => array('id' => 17),
    'Group' => array(
        array('group_id' => 2),
        array('group_id' => 3),
        array('group_id' => 4),
        array('group_id' => 5),
        array('group_id' => 6)
    )
);

HABTM 結合テーブル (groups_users) 内。次の保存呼び出しを試しましたが、どれも機能しませんでした。

$this->User->save($myData);
$this->User->saveAssociated($myData);
$this->User->saveAll($myData);
$this->User->GroupsUsers->save($myData);
$this->User->GroupsUsers->saveAll($myData);

質問する前に:はい、私の関連付けは正しく設定されており、次のように呼び出してデータを保存できました:

$this->User->GroupsUsers->saveAll(array(
    0 => array(
        'GroupsUsers' => array('user_id' => $id, 'group_id' => 1)
    ),
    1 => array(
        'GroupsUsers' => array('user_id' => $id, 'group_id' => 2)
    )
));

ただし、モデルの HABTM リレーションシップ定義でuniqueを falseに設定していますが、両方のレコードの 1 つだけが保存されます。

エラーはどこにありますか? 私の配列の構造は無効ですか?

4

3 に答える 3

0

たとえそれが古くてもあなたの質問に答えるだけです。

saveAll 呼び出しで 'GroupsUsers' モデルを呼び出す必要はありません。これはまさにモデルを関連付ける目的であり、cakePHP がそれを行います。

この配列を User/Group モデルの saveAll 関数に渡す必要があります。

array{
    array{
        'User' => array {
             'id' => 25
         },
         'Group' => array {
             'id' => 2
         }
    }
    array{
        'User' => array {
             'id' => 47
         },
         'Group' => array {
             'id' => 2
         }
    }
}

ユーザー モデルとグループ モデルの両方が相互に HABTM 関係を持つ必要があるため、次のようにするだけです。

ユーザー/グループ コントローラーから:

$this->User/Group->SaveAll($myData);

ユーザー/グループ モデルから:

$this->SaveAll($myData);

それだけです。GroupsUsers テーブルは 2 つのレコードを保存します。HABTM リレーション テーブルに自分で保存することで、cakePHP の機能を使用していません。

ID が存在しない場合は User テーブルと Group テーブルの両方のレコードが作成され、存在しない場合は更新されます。

HABTM テーブルに保存する唯一の理由は、たとえばメンバーがグループへの参加を求められた後にメンバーを検証したい場合に「検証済み」フィールドなど、このテーブルに保存したい追加情報がある場合です。

于 2014-01-14T09:56:08.987 に答える
0

試す

$myData = array(
    'User' => array('id' => 17),
    'Group' => array(
        'Group' => array(
            0 => 2,
            1 => 3,
            2 => 4,
            3 => 5,
            4 => 6
        )
    )
);
于 2013-08-20T10:03:50.940 に答える