私のCakePHPには、ModelBがたくさんあるModelAがあります。ModelB には int 値 Q があります。
ModelA にクエリを実行し、containable を使用して、Q の最大値を持つ ModelB のみが記録されるようにすることはできますか?
私はこれを試しました:
$this->ModelA->contain(array(
'ModelB.Q =(SELECT MAX(ModelB.Q) FROM modelb ModelB WHERE ModelA_id = ' . $id . ')'
));
しかし、CakePHP がその等値演算子の右側をフィールドとして解釈し (少なくとも私はそれが理由だと思います)、ドットを入れるため、MySQL エラーをスローします。
... WHERE `Draw`.`round` =.(SELECT MAX.(`Draw`.`round`) ...
これを行う方法はありますか?$query()
可能であれば、モードにドロップダウンする必要はありません。
編集OK、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 のオブジェクトから文字列への変換
最後はあまり明確ではありません:
モデル「トーナメント」はモデル「」に関連付けられていません
私はとてつもなく愚かだと思いますが、そこまでです。