6

私はこのエラーを検索しようとしましたが、何も見つからなかったという事実は、私が何かばかげたことをしていると信じるように導きます. 以下に関連するコードを含めますが、基本的には複数のテーブル継承 (またはClass Table Inheritance ) を使用し、Doctrine ORM findBy() メソッドを使用して識別子列に基づいてクエリを実行しようとしています。その結果、次の ORMException が発生します。スローされる:「認識されないフィールド: タイプ」。

例外をトリガーするコードは次のとおりです。

    // $this->em is an instance of \Doctrine\ORM\EntityManager
    $repository = $this->em->getRepository('JoeCommentBundle:Thread');

    return $repository->findOneBy(array(
        'type' => $this->type,
        'related_id' => $id
    ));

「ベース」抽象エンティティに関連するコードは次のとおりです。

<?php

namespace Joe\Bundle\CommentBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="comment_threads")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap( {"story" = "Joe\Bundle\StoryBundle\Entity\StoryThread"} )
 */
abstract class Thread
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(name="related_id", type="integer")
     */
    protected $relatedId;

    /** MORE FIELDS BELOW.... **/

最後に、具体的なスレッド エンティティのコードを次に示します。

<?php

namespace Joe\Bundle\StoryBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Joe\Bundle\CommentBundle\Entity\Thread as AbstractThread;

/**
 * @ORM\Entity
 * @ORM\Table(name="story_comment_threads")
 */
class StoryThread extends AbstractThread
{
    /**
     * @ORM\OneToOne(targetEntity="Story")
     * @ORM\JoinColumn(name="story_id", referencedColumnName="id")
     */
    protected $story;
}

スキーマを再確認しましたが、type列は確実に存在するため、何が原因なのかわかりません。何か案は?ありがとう。

4

2 に答える 2

15

ロブ、実際に親エンティティを使用してクエリを実行し、識別子の値をフィルタリングしようとするとき。代わりに、フェッチする子エンティティに関連するリポジトリで作業します。Doctrine が残りの作業を行います。したがって、あなたの場合、StoryThreadのリポジトリを取得する必要があります。

$repository = $this->em->getRepository('JoeCommentBundle:StoryThread');
return repository->find($id);
于 2012-05-11T15:09:39.807 に答える
12

識別子列を標準のエンティティ プロパティとして使用することはできません。

代わりに、次のことを行うことができます。

$dql = 'SELECT e FROM JoeCommentBundle:Thread e 
    WHERE e.related_id = :related_id AND e INSTANCE OF :type';
$query = $em->createQuery($dql);
$query->setParameters(array(
    'type' => $this->type,
    'related_id' => $id
));
$record = $query->getSingleResult();
于 2012-05-11T15:09:55.743 に答える