我可以在“可包含”的条件下使用子查询吗?

时间:2011-09-29 13:19:28

标签: mysql cakephp subquery max containable

在我的CakePHP中,我有ModelA,它有很多ModelB。 ModelB有一个int值Q。

我可以查询ModelA并使用containsable来确保只有那些具有Q值最大值的ModelB记录吗?

我试过这个:

$this->ModelA->contain(array(
    'ModelB.Q =(SELECT MAX(ModelB.Q) FROM modelb ModelB WHERE ModelA_id = ' . $id . ')'
));

但它会引发一个MySQL错误,因为CakePHP将该相等运算符的右侧解释为一个字段(至少我认为这就是原因)并将其点缀。

... WHERE `Draw`.`round` =.(SELECT MAX.(`Draw`.`round`) ...

有办法做到这一点吗?如果可能的话,我宁愿不必进入$query()模式。


编辑好的,在尝试按照api55建议的页面上的建议后,我有这段代码:

$dbo = $this->Tournament->getDataSource();
$conditionsSubQuery['"Draw"."tournament_id"'] = $id;
$maxRounds = $dbo->buildStatement(array(
    'fields' => array('MAX(Draw.round) AS prevRound'),
    'table' => $dbo->fullTableName($this->Tournament->Draw),
    'alias' => 'Draw',
    'limit' => null,
    'offset' => null,
    'joins' => array(), 
    'conditions' => $conditionsSubQuery,
    'order' => null,
    'group' => null
    ),
    $this->Tournament
);
$maxSubQuery = ' "Draw"."round" = (' . $maxRounds . ') ';
$maxSubQueryExpression = $dbo->expression($maxSubQuery);
$this->Tournament->contain(array(
    'Entrant.selected = 1',
    $maxSubQueryExpression
));
$tournament = $this->Tournament->read(null, $id);

但是当它运行时,它会给我7个通知/警告。前6个与传递的对象而不是字符串有关:

  

preg_match()期望参数2为字符串,给定对象

有6种变体:

  

类stdClass到字符串转换的对象

最后一点不太明确:

  

模型“锦标赛”与模型“”

无关

我怀疑我是非常愚蠢的,但我们走了。

1 个答案:

答案 0 :(得分:0)

包含使用条件作为普通查找,可以生成子查询并放入条件。所以你也应该能够做到这一点。尝试here中的子查询部分并告诉我它是如何进行的;)

这种为条件生成子查询的方式不应该失败:D因为是cakephp方式。 如果您收到错误或其他评论答案,看看我是否可以提供帮助。