我有几个表通过远程关系连接 - 例如:
A.id = B.a_id, B.id = C.b_id, C.id = D.c_id
并且给定A.id
,我想删除D
中与A.id
关联的所有行。
既然Model::deleteAll()
不接受任何加入,只接受条件,我该怎么做?
所有模型(A、B、C、D)都已定义belongTo
关系。
我最后的手段是原始SQL,但我想知道CakePHP中是否有办法做到这一点。
我找不到类似的问题,因为它们都是关于删除所有相关数据,而不仅仅是通过关联键删除一个表的数据。
使用可包含行为查找 D 记录
public function deleteD($idA){
$this->ModelA->Behaviors->load('Containable');
$options = array(
'contain' => array(
'ModelB' => array(
'ModelC' = array(
'ModelD'
)
)
),
'conditions' => array('ModelA' => $idA)
);
$findDIds = $this->ModelA->find('all',$options);
debug($findDIds); // find right path to ModelD
$ids = Hash::extract($findDIds,'{n}.ModelD.id');
$this->loadModel('ModelD');
foreach($ids as $id){
$this->ModelD->delete($id);
}
}
注意,我没有测试此功能。