Могу ли я использовать подзапросы в «содержательном» состоянии? - PullRequest
0 голосов
/ 29 сентября 2011

В моем CakePHP у меня есть ModelA, которая имеет много ModelB.ModelB имеет значение int Q.

Могу ли я запросить ModelA и использовать встраиваемые, чтобы гарантировать, что только те записи ModelB с максимальным значением для Q?

Я пробовал это:

$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 вариантовthis:

Объект класса stdClass для преобразования строк

Последнее менее понятно:

Модель "Турнир" не связана смодель ""

Я подозреваю, что я колоссально глуп, но мы идем.

1 Ответ

0 голосов
/ 29 сентября 2011

Содержимое использует условия как обычную находку, подзапрос может быть сгенерирован и помещен в условия.Таким образом, вы должны быть в состоянии сделать это также.Попробуйте часть подзапроса в здесь и расскажите мне, как все прошло;)

Этот способ генерации подзапросов для условий не должен завершиться неудачей: D, так как это путь cakephp.Если вы получили ошибку или что-то еще, прокомментируйте ответ, чтобы узнать, смогу ли я помочь.

...