2

さて、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 を取得できないため、削除部分に取り組み始めていません。数え切れないほどの「試み」で良い一日を過ごしましたが、すべて何も起こりませんでした.

何百万回も助けてくれてありがとう!

4

1 に答える 1

0

関連する日付 (ベンダー タイプ) は、ベンダー データ内の配列ではなく、外部にある必要があります。

array(
    'Vendor' => 
           array('name' => 'test', 'id' => 7),
    'VendorPaymentType => array(
         array('id' => 13, 'type' => 'payable'),
         array('type' => 'check')
    )
);

したがって、VendorPaymentType は Vendor データの一部ではありません。さらに混乱させるために、より深い関連付けは「親」配列の一部にする必要があります。

また:

  • VendorPaymentType レコードで Vendor の ID を繰り返す必要はありません
  • モデル名 VendorPaymentType (単数形) を使用すべきではありませんか?
  • コードでは、すべてのベンダーを一度に保存します。foreach ループ内に saveAssociated 呼び出しを入れると、自分で簡単にできるようになります。必要に応じて (そして InnoDB を使用して)、トランザクション内にラップできます。
  • 関連付けを一度に保存するのが難しい場合は、ベンダーを保存してから、VendorPaymentType への変更を保存し、必要に応じて新しいものを作成することができます。ループ内、おそらくトランザクション内。

お役に立てれば。:-)

参照: http://book.cakephp.org/2.0/en/models/ Saving-your-data.html

于 2013-01-16T22:43:36.440 に答える