私はクエリを書いているので、Doctrineを使ってテーブルに最後に挿入されたアイテムのIDを発見する必要があります。Doctrine2:テーブルの最後のIDを検出しますか?
私がしなければならなかった:あなたはフラッシュ、DoctrineがエンティティにエンティティIDを割り当てますとき
$this->getDoctrine()->getConnection()->prepare("SELECT MAX(id) FROM Commit");
私はクエリを書いているので、Doctrineを使ってテーブルに最後に挿入されたアイテムのIDを発見する必要があります。Doctrine2:テーブルの最後のIDを検出しますか?
私がしなければならなかった:あなたはフラッシュ、DoctrineがエンティティにエンティティIDを割り当てますとき
$this->getDoctrine()->getConnection()->prepare("SELECT MAX(id) FROM Commit");
。 はあなたのエンティティがあるとしましょう。)(
class MyEntity {
protectd $id;
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
}
あなたはEntityManagerの::フラッシュを行うと、最後に挿入IDは、$ idプロパティに割り当てされます。次に、$ myEntity-> getId()を実行して、最後に挿入されたIDを取得します。
実際はそうではありません。エンティティは同じ状態のままです。エンティティに適用された変更を取得するには、マネージャに更新を指示する必要があります。同様に.. $ em-> refresh($ myEntity); –
それは確かですか?私はちょうど簡単なテストを実行し、IDがリフレッシュせずに設定されていることを確認しました。私はそれがいくつかのケースでは異なった振る舞いをするかもしれないと思いますが、シンプルなauto-incでは違いは気付きませんでした。 – Cerad
Doctrineにはこれを行う方法がありません.flushは最近挿入された場合にのみ動作し、それを挿入したユーザーに対してのみ有効です。しかし、テーブルのサイズが大きいか何か他のものがあるためにそのテーブルをクエリしたくない場合は、そのIDを格納する別のテーブルを作成し、そのテーブルに新しい要素を追加するたびにそのテーブルを更新できます。あなたがそれをしたくなければ、あなたはあなたが言ったことをしなければならない。
Ceradが述べたように、本当に別のクエリを実行してエンティティidを取得するべきではありません。代わりに、エンティティマネージャーに、挿入時に取得した識別子をエンティティに移入(更新)させることができます。例は..
$myEntity = new \Entities\MyEntity();
$myEntity->setProperty($someValue);
// Save my entity ($em = EntityManager)
$em->persist($myEntity);
// Flush my entity manager
try {
$em->flush();
} catch (\Exception $e)
{
}
// Refresh my entity (populate the identifier)
$em->refresh($myEntity);
// Tada
echo $myEntity->getId();
問題は、私は新しいエンティティを作成したり削除したりしていません...誰がそれをしているのか分かりません。別の時間帯にアプリケーションの別の部分にあります。私はちょうど現在のIDが何であるか知りたい。 – vinnylinux
ああ、私はあなたがしていることは正しいと思います。カスタムクエリを用意するのではなく、DQLを使用して行うことはできますが。 $ q = $ em-> createQuery( 'SELECT MAX(id)FROM Commit'); $ res = $ q-> getSingleResult(\ Doctrine \ ORM \ Query :: HYDRATE_ARRAY); –
また、トランザクションデータベースを使用しない限り、この値は実行中に変更される可能性があることに注意してください。つまり、最大値を選択すると、システムは新しい最大値を更新します。間違った値で作業しています。 –
間違った結果が出る可能性があります。なぜあなたは最後のIDが必要ですか?ほとんどの場合、フラッシュ操作は新しいIDの設定を正しく行います。また、挿入されたエンティティのIDを設定して、実際に必要な場合にのみ使用できます。しかし、私は教義の有効なユースケースにはまだ触れていない。 – Cerad