さて、hasMany関係を含む最初のsaveAll(またはsaveManyまたはsaveAssociatedが「正しい」かどうかわからない)を試していますが、ケーキがこのデータをどのように望んでいるのかわかりません。メイン テーブルの name フィールドを更新することはできますが、hasMany 関係を更新することはできません。
私は正しい方向へのバンプを探しているだけで、学びたいと切望していますが、頭を使って壁に穴を開けるという考えはますます魅力的に見えます.
ちょっとした背景として、「vendors」テーブルと「vendor_payment_types」テーブルの 2 つのテーブルがあります。「vendors」テーブルには多くの「vendor_payment_types」があります。以下の構造:
vendors テーブル ID、company_id、名前
vendor_payment_types id、vendor_id、タイプ
現在、コントローラーに送信している配列は次のとおりです(支払いタイプにIDがあり、データベースに既に存在し、何もする必要がない場合、追加する必要があるIDがない場合、3番目の部分はデータベースには存在しますが、この配列には存在しないため、データベースから削除する必要があります):
Array
(
[0] => Array
(
[Vendor] => Array
(
[id] => 7
[company_id] => 2
[name] => Test Vendor
[VendorPaymentTypes] => Array
(
[0] => Array
(
[vendor_id] => 7
[id] => 13
[type] => payable
)
[1] => Array
(
[vendor_id] => 7
[type] => check
)
[2] => Array
(
[vendor_id] => 7
[id] => 14
[type] => cash
)
)
)
)
私がする必要があるのは、a) 名前を更新することです b) 新しい VendorTypes を追加する c) POST された配列にはなく、データベースに存在する VendorTypes を削除します。以下は、VendorController にあるものです。
public function save() {
$vendors = array();
$companyid = $this->Auth->user('company_id');
$needle = 'new';
$i = 0;
// Setup array and also if id of payment_type includes "new" unset the id so cake will add a new and not try and match id and update
if ($this->request->is('post')) {
foreach ($this->request->data['Vendor'] as $vendorId => $vendor) {
$vendors[$vendorId]['Vendor']['id'] = $vendorId;
$vendors[$vendorId]['Vendor']['company_id'] = $companyid;
$vendors[$vendorId]['Vendor']['name'] = $vendor['name'];
foreach ($vendor['VendorTypes'] as $type => $val) {
if ($val != '0') {
$vendors[$vendorId]['Vendor']['VendorPaymentTypes'][$i]['vendor_id'] = $vendorId;
$vendors[$vendorId]['Vendor']['VendorPaymentTypes'][$i]['id'] = $val;
$vendors[$vendorId]['Vendor']['VendorPaymentTypes'][$i]['type'] = $type;
if (strstr($vendors[$vendorId]['Vendor']['VendorPaymentTypes'][$i]['id'], $needle)) {
unset($vendors[$vendorId]['Vendor']['VendorPaymentTypes'][$i]['id']);
}
$i++;
}
}
}
// Clean up array to make it an array starting at 0 and not based on vendor['id']
$cleanedarr = array();
foreach ($vendors as $vendor => $data) {
$cleanedarr[] = $data;
}
// Currently this only updates the name
if ($this->Vendor->saveAll($cleanedarr, array('deep' => TRUE) )) {
$this->Session->setFlash('Updated Vendors!');
die(pr($this->Vendor->getDataSource()->getLog()));
} else {
$this->Session->setFlash('Failed to Update');
}
}
}
ベンダーモデルは次のように設定されています
public $name = 'Vendor';
public $hasMany = array(
'VendorPaymentTypes' => array(
'className' => 'VendorPaymentTypes',
'foreignKey' => 'vendor_id',
'dependent' => true
)
);
追加する新しい vendor_types を取得できないため、削除部分に取り組み始めていません。数え切れないほどの「試み」で良い一日を過ごしましたが、すべて何も起こりませんでした.
何百万回も助けてくれてありがとう!