0

私の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 のオブジェクトから文字列への変換

最後はあまり明確ではありません:

モデル「トーナメント」はモデル「」に関連付けられていません

私はとてつもなく愚かだと思いますが、そこまでです。

4

1 に答える 1

0

containsは通常の検索として条件を使用し、サブクエリを生成して条件を設定できます。したがって、これも実行できるはずです。ここでサブクエリの部分を試して、どのように進んだか教えてください;)

条件のサブクエリを生成するこの方法は、cakephpの方法であるため、失敗しないはずです:D。エラーや何かがあった場合は、私が助けることができるかどうかを確認するために答えをコメントしてください。

于 2011-09-29T14:09:28.070 に答える