cakePHP首次保存数据(有很多关系)

cakePHP首次保存数据(有很多关系),cakephp,Cakephp,好的,我正在尝试我的第一个saveAll(或saveMany或saveAssociated,不确定哪个是“正确的”),它包含一个hasMany关系,我似乎无法理解cake是如何需要这些数据的。我可以在主表上获取要更新的name字段,但无法获取要更新的hasMany关系 我只是在寻找一个正确的方向,我渴望学习,但用我的头在墙上打个洞的想法看起来越来越诱人 我有两个表“供应商”表和“供应商付款类型”表。“供应商”表有许多“供应商付款”类型。结构如下: 供应商表 身份证,公司身份证,姓名 供应商付款类

好的,我正在尝试我的第一个saveAll(或saveMany或saveAssociated,不确定哪个是“正确的”),它包含一个hasMany关系,我似乎无法理解cake是如何需要这些数据的。我可以在主表上获取要更新的name字段,但无法获取要更新的hasMany关系

我只是在寻找一个正确的方向,我渴望学习,但用我的头在墙上打个洞的想法看起来越来越诱人

我有两个表“供应商”表和“供应商付款类型”表。“供应商”表有许多“供应商付款”类型。结构如下:

供应商表 身份证,公司身份证,姓名

供应商付款类型 标识,供应商标识,类型

当前,我发送给控制器的数组是(如果付款类型的id表示它已经存在于数据库中,无需任何操作,如果没有需要添加的id,则第三部分是,如果它存在于数据库中,但不在该数组中,则需要从数据库中删除):

我需要做的是a)更新名称b)添加任何新的VendorTypes c)删除任何不在POST'ed数组中但存在于数据库中的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
    )
);
我甚至还没有开始处理删除部分,因为我无法添加新的供应商类型。我花了一天时间进行了无数次“尝试”,但都没有结果

非常感谢您的帮助!

关联的日期(供应商类型)不应该是供应商数据内部的数组,而应该是外部的数组

array(
    'Vendor' => 
           array('name' => 'test', 'id' => 7),
    'VendorPaymentType => array(
         array('id' => 13, 'type' => 'payable'),
         array('type' => 'check')
    )
);
所以VendorPaymentType不是供应商数据的一部分。为了进一步让您感到困惑,更深层次的关联应该是“父”数组的一部分

此外:

  • 您不必在VendorPaymentType记录中重复供应商id
  • 您不应该使用型号名称VendorPaymentType(单数)吗
  • 在代码中,您可以一次保存所有供应商。如果您在foreach循环中放置一个saveAssociated调用,您可以使自己更轻松。如果需要(并使用InnoDB),您可以将其包装到事务中
  • 如果一次保存关联太困难,您可以只保存供应商,然后保存到对de VendorPaymentType的更改,并在需要时创建新的更改。在循环中,可能在事务内部
希望这有帮助。:-)


另请参见:

我也面临着同样的问题。和你一样,它开始感觉我做错了什么,因为人们已经写了太多预处理的东西。从我的印象中,使用HasandBelongTomany会给我一种更为自然的感觉,尽管对于多选来说感觉有点不必要的复杂。
array(
    'Vendor' => 
           array('name' => 'test', 'id' => 7),
    'VendorPaymentType => array(
         array('id' => 13, 'type' => 'payable'),
         array('type' => 'check')
    )
);