CakePHP-通过关联键删除数据

CakePHP-通过关联键删除数据,php,cakephp,cakephp-2.5,Php,Cakephp,Cakephp 2.5,我有几个表是通过远程关系连接的,例如: 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个记录

我有几个表是通过远程关系连接的,例如:

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);
   }
}

注意,我没有测试这个函数。

I-D模型之间的关系是如何定义的?@Salines问题的第二行,它们通过B和C模型相关,如果我不能说得更清楚的话,很抱歉。您可以在B上执行查询以获取其id,然后使用B.id获取C.id,您可以在
DeleteAll
方法中使用它,但这将是低效的(需要在
deleteAll
之前运行至少一个额外的
find
)。只需运行原始SQL并记录您的代码SQL是如何工作的。@AgRizzo嗯,原始SQL确实是我最后的选择,但是对于CakePHP中的建议,您将如何编写从A.id获取C.id的查找?你可以把它写在答案里。看看@Salines answer。我添加了一条注释,在获得需要删除的C.id列表后,我将如何使用
deleteAll
(使用C.id与D.C\u id字段进行比较)。使用
deleteAll
会有更好的性能。您可以将
find
更改为具有
'fields'=>数组('DISTINCT C.id')
(并且您不需要
包含
到ModelD)。该
find
的结果应该能够在
deleteAll
条件中使用(类似于
$conditions=>数组('D.c_id'=>$findDIds)