3

注:私は最初にこの質問を約1時間前に行いましたが、最近、大きなコピーアンドペーストの間違いを犯したことに気づきました。古い投稿を削除して最初からやり直す方が簡単だったほど重要なものです。申し訳ありません。

CakePHPフレームワークでは、モデルを更新した後、SQLクエリをダンプしました。COUNT(*)明らかな理由もなく、2回呼び出されます。

だから私は2つのモデルを持っています、$Fooそして$Bar。簡単にするために、私はそれらの間の関係を定義していません$belongsTo$hasMany問題は$Fooのみに関係しますが、念のために$Barのコードも含めました。

$data = array(
    'something' => 12,
    'something_else' => $this->Bar->field('id', $conditions),
);

$this->Foo->id = $this->Foo->field($data);
$this->Foo->save($data);

$Bar.id一連の条件(ここでは関係ありません)に従ってフィールドを取得しています。そのIDを使用して、に$dataINSERTまたはUPDATEする必要があるかどうかを判断し$Fooます。$Fooの要件を満たすIDがある場合、$dataその値が返されます。falseでない場合は、返されます。CakePHPのアーキテクチャによるとsave()、有効なIDがある場合は更新されます。それ以外の場合はINSERTになります。私は異常なことは何もしていないと確信しています。

SQLダンプに表示されるものは次のとおりです。

SELECT `Foo`.`id` FROM `foos` AS `Foo` WHERE `something` = 12 AND `something_else` = 1 LIMIT 1
SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1
SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1
UPDATE `foos` SET `something` = 12, something_else` = 1 WHERE `foos`.`id` = 1'

私の人生では、COUNT()なぜそれが必要なのか、ましてやなぜそれが2回呼び出されるのか理解できません。誰かが何が起こっているのか考えていますか?助けてくれてありがとう。

4

2 に答える 2

3

私はCakePHPを使ったことがありませんが、ここでソースコードを見ると、フィールド関数でfindメソッドを呼び出していることがわかります。

したがって、この呼び出し

$data = array(
    'something' => 12,
    'something_else' => $this->Bar->field('id', $conditions),
);

生成:

SELECT `Foo`.`id` FROM `foos` AS `Foo` WHERE `something` = 12 AND `something_else` = 1     LIMIT 1

次に、設定されたフィールド呼び出し

$this->Foo->id = $this->Foo->field($data);

これは、内部のfind関数呼び出しを介して生成されます。

SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1

Save関数は、findを呼び出して、保存する前にレコードが存在するかどうかを確認します。これにより、2番目の呼び出しが生成されます。

SELECT COUNT(*) AS `count` FROM `foos` AS `Foo` WHERE `Foo`.`id` = 1

最後のクエリは、明らかに保存自体です。

私がそれを正しく読んでいることを確認するためにあなた自身を探してください、しかしそれはそれがするように見えることです。

于 2012-06-21T02:32:41.033 に答える
0

何が起こっているのかを伝えることはできませんが(十分なコードがないと思うので)、回避策を提供することはできます。

「INSERTINTOtable(id、field、field2)VALUES(id、value、value2)ON DUPLICATE KEY UPDATE field = value、field2 = value2」構文を使用して、クエリを実行します。

これにより、SQLが重複をチェックできるようになり、行が存在することをチェックしてから挿入を試みるまでの数分の1秒も短縮されます(チェック後に別のプロセスが挿入された場合に備えて)。このため、フィールド「id」は主キーまたは「一意の」インデックスのいずれかである必要があります。これにより、更新がトリガーされることがわかります。

于 2012-06-21T00:53:21.200 に答える