在我的 CakePHP 中,我有 ModelA,它有很多 ModelB。ModelB 有一个 int 值 Q。
我可以查询ModelA并使用containable来确保只有那些具有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 的对象到字符串的转换
最后一个不太清楚:
模型“锦标赛”与模型“”无关
我怀疑我非常愚蠢,但我们走了。