2016-10-11 8 views
1

Oracleデータベースに接続しているSymfonyのDoctrineでクエリビルダーを使用してクエリを実行します。私は、コントローラでこのコードを使用して、現在あるすべての予約の結果を取得しようとしていた。質問ビルダーを使用したSymfonyでのクエリの結果の数が正しくありません

$bookRepo = $this->getDoctrine() 
    ->getRepository('AppBundle:VScheduledRoomActivity'); 
$now = new \DateTime(); 
$curBookDataQuery = $bookRepo->createQueryBuilder("c"); 
$curBookDataQuery 
    ->where('c.startStamp < :now') 
    ->andWhere('c.endStamp > :now') 
    ->setParameter('now', $now) 
; 
$curBookData = $curBookDataQuery->getQuery()->getResult(); 

これは5されている必要があり、現在のすべての予約を、返す必要があります(私は、Oracle SQL Developerで効果的に同じクエリを実行しました)が1つしか戻ってこなかった。私はその質問に悩まされ、いつもよりも結果が少なくなっています。

だから私は、findAllとそれを比較するビルダーを何も比較していないと思いました。だから私はこのように見えるようにコードを変更:

$bookRepo = $this->getDoctrine() 
    ->getRepository('AppBundle:VScheduledRoomActivity'); 
$curBookDataQuery = $bookRepo->createQueryBuilder("c"); 
$curBookData = $curBookDataQuery->getQuery()->getResult(); 
$curBookData2 = $bookRepo->findAll(); 

私が返されたかどうか確認するためにダンプを()を使用するときに、$ curBookDataおよび$ currBookData2のための915のための15件の結果がありました。これらはまったく同じ結果になるはずです。

誰にもこの問題があったのですか、それを解決する方法がありますか?

UPDATE: 私はいくつかのより多くの情報を発見した、と私はそのIDで行うことを考えています。 Missing rows when querying table with Doctrine (Symfony2)で、それは主キーの問題であることがわかりました。それを調べると、Doctrineは主キー(データベースを最初に実行しています)をoccurrence_noという名前のフィールドに設定しました。これは、リピート予約(その整数)を追跡するために使用されるキーではなく、主キーはactivity_idです。だから私は

@ORM\Id 

をプライマリキーとして使用しました。これは9つの結果に変更されました。私はそれが文字列の種類を持っていたことを見たので、私は行を編集した:

@var guid 
@ORM\Column(name="ACTIVITY_ID", type="guid", nullable=false) 

@var string 
@ORM\Column(name="ACTIVITY_ID", type="string", nullable=true) 

と今では67件の結果を示している

@ORM\GeneratedValue(strategy="UUID") 

を追加しました!私は、これらの詳細を編集すると、結果の数が変更されたときに主キーがGUIDであることと関係があると思います。

別のノート:これは図であり、私はそれが読み取り専用であることを確認するために

@ORM\Entity(readOnly=true) 

を使用していました。

+2

デバッグツールバー/プロファイラで実行されたクエリを見て、データベース内で直接実行しようとします。 – Gerry

+1

$ nowのあなたの価値は何ですか、例えば分だけ正確であれば、それ以上ではなく、それ以上ではないが、 – Rooneyl

+0

と等しいレコードの負荷がかかる可能性があります。Gerry:私は - > getSQL SQL文をOracle SQL Developerに取り込んで実行し、915を取得する必要があります。したがって、文は正しいです。 Rooneyl:$ nowの値は問題なく、ダンプされてSQL開発者にコピーされ、それが正しいことを確認し、正しい応答を得ました。私は何か他のものを見つけ、新しい情報で質問に更新を加えます。 – MicWit

答えて

0

問題は解決しました。将来的に立ち往生、誰のために注意すべき最初のいくつかのこと: - クエリビルダを使用する場合は、IDが正しいフィールド に設定されていることを確認してください - あなたはGUIDを使用している場合、フィールドはGUIDに設定されていることを確認していない文字列(データベースの自動マッピングを使用する場合) - コンポジットキーを使用する場合は、IDが両方ともに設定されていることを確認してください.DONTを使用すると、generatedValueが使用され、コンストラクタを設定します(下記参照)。

この状況の解決策です。

問題1 - 他の誰かが作成したビューを使用していて、GUIDが主キーであったと推測しました。これは悪い仮定であり、キーの第2部分として整数を持つ複合キーでした。 問題2 - ビューに到達するまでにデータが何らかの形で重複していたため、一部の複合キーが一意ではありませんでした。データをさらに上にリフレッシュした後、正しい値をもたらすように見えました。

クエリビルダーの背景: findAll()のようなものを使用すると、プライマリキーが一意でない状況で動作することがわかります。ただし、クエリビルダでは主キーでDISTINCTの結果が得られます。主キーが正しく定義されていない場合や何らかの理由で2倍になった場合は、重複する行はありません。

が複合キーを設定するには、私がやった:

/** 
* @var integer 
* 
* @ORM\Column(name="OCCURRENCE_NO", type="integer", nullable=false) 
* @ORM\Id 
*/ 
private $occurrenceNo; 

/** 
* @var guid 
* 
* @ORM\Column(name="ACTIVITY_ID", type="guid", nullable=false) 
* @ORM\Id 
*/ 
private $activityId; 

public function __construct($occurrenceNo, $activityId) 
{ 
    $this->occurrenceNo= $occurrenceNo; 
    $this->activityId= $activityId; 
} 

を複合キーの詳細については:私が唯一の文字列と整数を使用することができますDoctrineのドキュメントで見たのhttp://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

注意しかし、コンポジットキーの場合、GUIDがうまく動作することがわかりました(私はDoctrine 2.1からうまくいくはずです)。

関連する問題