【问题标题】:Can I use subqueries in a 'containable' condition?我可以在“可包含”条件下使用子查询吗?
【发布时间】:2011-09-29 13:19:27
【问题描述】:

在我的 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 类的对象到字符串的转换

最后一个不太清楚:

模型“Tournament”与模型“”没有关联

我怀疑我非常愚蠢,但我们开始了。

【问题讨论】:

  • contain 使用条件作为普通查找,可以生成子查询并放入条件中。所以你也应该能够做到这一点。尝试here 中的子查询部分并告诉我它是如何进行的;)(我的意思是生成条件并在包含中使用条件=>$conditions)
  • @api55 你又来了!我的英雄!您应该将其作为答案,以便我可以在需要时将其标记为正确。
  • 您能否查看通知/警告的堆栈跟踪并告诉我们哪一行正在调用错误...。是雪球效应,第一个警告会生成第二个警告和最后一个警告。我认为这条线是错误的 $dbo = $this->Tournament->getDataSource();有了这个'table' => $dbo->fullTableName($this->Tournament->Draw),我也建议 find('first',...) 而不是 read...
  • 事实证明,除了上述最后一个问题之外,所有问题确实是由一个错误引起的。必须使用$maxSubQueryExpression->value 而不是$maxSubQueryExpression。尽管如此,仍在努力让它使用正确的模型。我认为问题出在这一行:$maxSubQuery = ' "Draw"."round" = (' . $maxRounds . ') '; 现在的错误是Model "Tournament" is not associated with model " "Draw""
  • 我试过摆弄Draw.round 的指定方式,但似乎每种方式都会导致某种错误。

标签: mysql cakephp subquery max containable


【解决方案1】:

contain 使用条件作为正常查找,可以生成子查询并放入条件。所以你也应该能够做到这一点。试试here 中的子查询部分,告诉我结果如何;)

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

【讨论】:

  • 这有点啰嗦,但我已经尝试进行了编辑。 (以及它导致的错误。)
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 2020-09-25
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多