根据CakePHP中的第三级关系查询数据

时间:2009-09-12 20:03:55

标签: php cakephp python-datamodel

我设置了以下关系:

A HABTM B
B belongsTo C
C hasMany B

现在,对于给定的A,我需要附加B的所有C。我可以编写SQL查询,但是什么是正确的CakePHP方式?我可以使用哪种方法调用哪种模型以及使用哪些参数?

4 个答案:

答案 0 :(得分:0)

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);
像这样?

答案 1 :(得分:0)

这可能有效

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

答案 2 :(得分:0)

我会选择Aziz的答案并简单地处理数据。如果你需要C作为主要模型,你将不得不做一些解决方法。蛋糕在相关模型上的条件并不是非常好,特别是对于删除的第三代表兄弟的查询。它通常只对belongsTo或hasMany关系进行实际的JOIN查询;但不是HABTM关系,它是在单独的查询中获得的。这意味着您不能在相关的HABTM模型中包含条件。

你最好的选择可能是这样的:

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

请注意,这会产生大量查询,因此它不是最佳解决方案。编写自己的SQL实际上可能是最干净的方法。

编辑:

或者,您可以re-bind your associations on the fly使它们具有多个/且属于关系,很可能使用A和B的连接表/模型。这可能使您更容易在相关模型上使用条件,但它仍然很棘手条件在A上时获取C。

答案 3 :(得分:0)

我会想到“可以控制”的行为(http://book.cakephp.org/view/474/Containable)......可以很好地控制查找相关数据。