1

Symfonyの「本」では、他のエンティティを参照してエンティティについて説明しています。私の場合のように、それを参照する多くの「コメント」エンティティを持つ「投稿」エンティティがある場合、そのIDで投稿をロードしてから、$ post-> getComments()を実行できます。

コメントは遅延ロードされているようです。1つずつロードしてそれぞれをロードするか(明らかに間違っています)、すべてを個別のクエリでロードする必要があります(これは可能ですが、私はしません具体的には、そのクエリをどこに配置するかわからない)。ただし、この本は次のように示唆しています。「もちろん、両方のオブジェクトにアクセスする必要があることが事前にわかっている場合は、元のクエリで結合を発行することで2番目のクエリを回避できます。」(現在空の)postRepositoryクラスにメソッドを追加することをお勧めします。私はそうします、そしてそれはこのように見えます:

public function loadPostFull($pid)
{
    return $this->getEntityManager()
        ->createQuery('
            SELECT p, c FROM BUNDLENAME:Post p
            JOIN p.comments c
            WHERE p.id = :id')
        ->setParameter('id', $pid);
    try {
        return $query->getSingleResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

そして、私のコントローラーで私はします:

$fullPost = $this->getDoctrine()
            ->getRepository('BUNDLENAME:Post')
            ->loadPostFull($id);
$id = $fullPost->getId();

しかし、$ idに対する私の単純な要求は、「致命的なエラー:未定義のメソッドDoctrine \ ORM \ Query :: getId()の呼び出し」を示します。名前を入力すると失敗するため、コントローラーがloadPostFullメソッドを正しく検出していることはわかっています。適切なPostエンティティを返さないだけです。-> loadPostFull($ id)ではなく-> find($ id)を呼び出すようにコントローラーを変更すると、Postidのすべての内部メソッドを使用できます。

マニュアルは私がそれをすることができると示しているようです!どうしたの?

4

1 に答える 1

2

タイプミスがあると思います:)。コードの最初の行を見てください。返品明細があります!したがって、Query オブジェクトを返して { } catch() { } に到達することはありません。次のように配置する必要があります。

$query = $this->getEntityManager()
    ->createQuery('
        SELECT p, c FROM BUNDLENAME:Post p
        JOIN p.comments c
        WHERE p.id = :id')
    ->setParameter('id', $pid);
try {
    return $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
    return null;
}
于 2013-03-16T06:51:38.547 に答える