2

我对 CakePHP 2.x使用Utils 插件的softdelete 行为

我有以下 4 张桌子

  1. 顾客
  2. 客户地址
  3. 客户联系人
  4. 客户报告

并考虑遵循其相互关系,

1. 为客户

客户有很多客户地址

客户有很多客户联系方式

客户有很多客户报告

public $hasMany = array(
    'CustomerAddress' => array(
        'className' => 'CustomerAddress',
        'foreignKey' => 'customer_id',
        'dependent' => true,
        ),
    'CustomerContact' => array(
        'className' => 'CustomerContact',
        'foreignKey' => 'customer_id',
        'dependent' => true,
        ),
    'CustomerReport' => array(
        'className' => 'CustomerReport',
        'foreignKey' => 'customer_id',
        'dependent' => true,
        )
);

2. 对于 customer_addresses

客户地址属于客户

CustomerAddress 属于状态

客户地址有一个客户联系方式

CustomerAddress 有一个 CustomerReport

public $belongsTo = array(
    'Customer' => array(
        'className' => 'Customer',
        'foreignKey' => 'customer_id',
        'dependent' => false,
        ),
    'State' => array(
        'className' => 'State',
        'foreignKey' => 'state_id',
        )
);
public $hasOne = array(
    'CustomerContact' => array(
        'className' => 'CustomerContact',
        'foreignKey' => 'customer_address_id',
        'dependent' => true,
        ),
    'CustomerReport' => array(
        'className' => 'CustomerReport',
        'foreignKey' => 'customer_address_id',
        'dependent' => true,
        )
);

3.对于customer_contacts

客户联系属于客户

CustomerContact 属于 CustomerAddress

public $belongsTo = array(
    'Customer' => array(
        'className' => 'Customer',
        'foreignKey' => 'customer_id',
        'dependent' => false,
        ),
    'CustomerAddress' => array(
        'className' => 'CustomerAddress',
        'foreignKey' => 'customer_address_id',
        'dependent' => true,
        )
);

4. 对于客户报告

客户报告属于客户

CustomerReport 属于 CustomerAddress

public $belongsTo = array(
    'Customer' => array(
        'className' => 'Customer',
        'foreignKey' => 'customer_id',
        'dependent' => false,
        ),
    'CustomerAddress' => array(
        'className' => 'CustomerAddress',
        'foreignKey' => 'customer_address_id',
        'dependent' => true,
        )

);

我在引导程序中放入了以下代码。

CakePlugin::load('Utils');

我还在上述所有模型中添加了下面的actAs

public $actsAs = array('Containable','Utils.SoftDelete');

我已经在我的 appModel 中添加了以下代码。

// for softdelete, checking exist id
public function exists($id = null) {
    if ($this->Behaviors->attached('SoftDelete')) {
        return $this->existsAndNotDeleted($id);
    } else {
        return parent::exists($id);
    }
}
// for softdelete, overrite delete method
public function delete($id = null, $cascade = true) {
    $result = parent::delete($id, $cascade);
    if ($result === false && $this->Behaviors->enabled('SoftDelete')) {
       return $this->field('deleted', array('deleted' => 1));
    }
    return $result;
}

当我尝试在没有软删除的情况下级联删除(意味着简单的级联删除)时,它工作正常。但我的问题是。当我使用Utils 插件的 softdelete 行为时,级联删除不起作用。

我尝试使用以下代码删除记录

if ($this->CustomerAddress->delete()) {
        $this->Session->setFlash(__('CustomerAddress deleted'));
        $this->redirect($this->referer());
    }

SQL 日志

array(
'log' => array(
    (int) 0 => array(
        'query' => 'SELECT COUNT(*) AS `count` FROM `lewie`.`customer_addresses` AS `CustomerAddress` LEFT JOIN `lewie`.`customers` AS `Customer` ON (`CustomerAddress`.`customer_id` = `Customer`.`id`) LEFT JOIN `lewie`.`states` AS `State` ON (`CustomerAddress`.`state_id` = `State`.`id`) LEFT JOIN `lewie`.`customer_contacts` AS `CustomerContact` ON (`CustomerContact`.`customer_address_id` = `CustomerAddress`.`id`) LEFT JOIN `lewie`.`customer_reports` AS `CustomerReport` ON (`CustomerReport`.`customer_address_id` = `CustomerAddress`.`id`)  WHERE `CustomerAddress`.`id` = 43 AND `CustomerAddress`.`deleted` = '0'',
        'params' => array(),
        'affected' => (int) 1,
        'numRows' => (int) 1,
        'took' => (float) 0
    ),
    (int) 1 => array(
        'query' => 'SELECT COUNT(*) AS `count` FROM `lewie`.`customer_addresses` AS `CustomerAddress` LEFT JOIN `lewie`.`customers` AS `Customer` ON (`CustomerAddress`.`customer_id` = `Customer`.`id`) LEFT JOIN `lewie`.`states` AS `State` ON (`CustomerAddress`.`state_id` = `State`.`id`) LEFT JOIN `lewie`.`customer_contacts` AS `CustomerContact` ON (`CustomerContact`.`customer_address_id` = `CustomerAddress`.`id` AND `CustomerContact`.`deleted` = '0') LEFT JOIN `lewie`.`customer_reports` AS `CustomerReport` ON (`CustomerReport`.`customer_address_id` = `CustomerAddress`.`id` AND `CustomerReport`.`deleted` = '0')  WHERE `CustomerAddress`.`id` = 43 AND `CustomerAddress`.`deleted` = '0'',
        'params' => array(),
        'affected' => (int) 1,
        'numRows' => (int) 1,
        'took' => (float) 1
    ),
    (int) 2 => array(
        'query' => 'SELECT COUNT(*) AS `count` FROM `lewie`.`customer_addresses` AS `CustomerAddress` LEFT JOIN `lewie`.`customers` AS `Customer` ON (`CustomerAddress`.`customer_id` = `Customer`.`id`) LEFT JOIN `lewie`.`states` AS `State` ON (`CustomerAddress`.`state_id` = `State`.`id`) LEFT JOIN `lewie`.`customer_contacts` AS `CustomerContact` ON (`CustomerContact`.`customer_address_id` = `CustomerAddress`.`id` AND `CustomerContact`.`deleted` = '0') LEFT JOIN `lewie`.`customer_reports` AS `CustomerReport` ON (`CustomerReport`.`customer_address_id` = `CustomerAddress`.`id` AND `CustomerReport`.`deleted` = '0')  WHERE `CustomerAddress`.`id` = 43 AND `CustomerAddress`.`deleted` = '0'',
        'params' => array(),
        'affected' => (int) 1,
        'numRows' => (int) 1,
        'took' => (float) 0
    ),
    (int) 3 => array(
        'query' => 'UPDATE `lewie`.`customer_addresses` SET `deleted` = '1', `deleted_date` = '2014-05-27 10:46:43', `modified` = '2014-05-27 10:46:43'  WHERE `lewie`.`customer_addresses`.`id` = '43'',
        'params' => array(),
        'affected' => (int) 1,
        'numRows' => (int) 1,
        'took' => (float) 0
    ),
    (int) 4 => array(
        'query' => 'SELECT `CustomerAddress`.`deleted` FROM `lewie`.`customer_addresses` AS `CustomerAddress`   WHERE `deleted` = '1'    LIMIT 1',
        'params' => array(),
        'affected' => (int) 1,
        'numRows' => (int) 1,
        'took' => (float) 0
    )
),
'count' => (int) 5,
'time' => (float) 1)

我该如何解决这个问题?

4

0 回答 0