要求されたように、これは$this->request->data
私のフォームを形成するものです、
'office' => 'LON-test33',
'phone' => '456456456',
'address' => [
'addline1' => '1 test0009 st',
'addline2' => 'p09987',
'addline3' => 'test9999',
'postcode' => 'p888',
'country_id' => '226'
],
つまり、オフィス、電話は私のオフィステーブルの一部であり、住所はアドレステーブル全体です。
また、IDを指定してアドレステーブルだけを更新しようとすることで、モデル内に何かがあるかどうかを確認するためのテストも実行しました。これはうまくいくので、私のモデルは問題ありません。だから私はOfficeモデルと何か関係があるのか、それとも私のコードに何か問題があるのかを考えていますか?
ありがとう、
だから私はCakePHP3.0.somethingを使用しています...。
オフィステーブルに関連付けられているデータであるアドレスを更新しようとしています。しかし、オフィスを更新すると、住所はまったく新しいレコードとして保存されますか?理由がわかりませんか?
これが私がこれまでやってきたことです、
$OfficeTable = TableRegistry::get('Offices');
$CurrentOffice = $OfficeTable->get($OfficeID);
$OfficeTable->patchEntity($CurrentOffice, $this->request->data, ['associated' => ['Addresses']]);
debug( $OfficeTable->save($CurrentOffice) );
Associated
patchEntityにを設定しても違いはないようです。更新されたアドレスは保存されますが、新しいレコードとして保存されます。この新しいレコードIDは、Officeテーブルの「address_id」フィールドに配置されます。
しかし、なぜこの「新規/編集済み」アドレスを新しいレコードとして追加し、関連するIDレコードを更新しないのですか?
今私はドキュメントを読んでいて、私が理解していることを形成しました、それがレコードを見つけることができない場合、それは新しいレコードを作りますか?ただし、保存呼び出しをデバッグしました。オフィスとアドレスの両方で、「[new]」がfalseに設定されています。では、なぜ私のオフィスを更新するのに、新しいものではないと言われているときに新しいアドレスを作成するのですか?
さらに、デバッグ呼び出しの最後に、更新する必要のあるレコードの古いアドレスIDを含む「[original]」があります。
だから私は何が間違っているのですか?
私が自分自身を正しく説明していない場合(私は失読症です)、私に知らせてください、または何かが足りない場合は更新できます-ありがとう
一般に、これを解決する方法は2つあります。
リクエストデータとともにIDを渡すことによって、IDフィールドをエンティティ内でアクセス可能として設定する必要があります。これにより、パッチ適用プロセスで設定できるようになります。
または、パッチを適用するエンティティにIDがすでに存在することを確認します。たとえば、エンティティを取得するときに関連付けを含めるなどです。
$CurrentOffice = $OfficeTable->get($OfficeID, [
'contain' => [
'Addresses'
]
]);
個人的には後者の方法をお勧めします。IDにアクセスできるようにする必要がないため、落とし穴が少なくなるからです。ここをお読みになることをお勧めします:悪意のあるユーザーが追加アクションでデータを更新するのを防ぐ
とはいえ、住所の詳細を変更するとすべてのオフィスに「影響」するため、オフィスと一緒に住所を編集するという事実は少し奇妙に思えます。したがって、通常、両方を同時に編集する必要はありません。ただし、アプリの内部と要件がわからないため、これは表面的な懸念事項にすぎません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加