2012-05-11 2 views
4

이 오류를 찾으려고 시도했지만 아무 것도 발견하지 못했기 때문에 내가 바보 같은 짓을한다는 것을 알게되었습니다. 아래에 관련 코드를 포함 하겠지만 기본적으로 다중 테이블 상속 (또는 Class Table Inheritance)을 사용하고 Doctrine ORM findBy() 메서드를 사용하여 discriminator 열을 기반으로 쿼리하려고하면 다음과 같은 ORMException이 throw됩니다. "인식 할 수없는 입력란 : 유형" 여기 Doctrine2.1 : DiscriminatorColumn에 의한 결과로 "알 수없는 필드"예외가 발생합니다.

// $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 열이 분명히 존재하므로이 문제의 원인이 무엇인지 확신 할 수 없습니다. 어떤 아이디어? 감사.

+0

교리는 당신을 위해 매핑을 처리하는 "유형"열을해야합니다. 나는 그것의 예약 키워드 및 어쩌면 일부 문제가 발생 궁금하네요. 다른 것으로 변경해보고 문제가 계속 발생하는지 확인하십시오. –

+1

Lee에게 감사하지만 "thread_type"으로 변경해도 아무런 차이가 없습니다. 다행히도 이것은 내 로컬 xdebug를 수정하도록 강요했으며, 이제 Doctrine \ ORM \ Persisters \ BasicEntityPersister에 1205 행의 체크가 있음을 볼 수 있습니다. "if (isset ($ this -> _ class-> columnNames [$ 들]))". $ this-> _class-> columnNames 배열에는 차별적 인 열 ('type'또는 'thread_type')이 포함되어 있지 않지만 나중에 나오는 세부 정보가 들어있는 $ this -> _ class-> discriminatorColumn 배열이 있습니다. Doctrine의 버그로 간주되지 않습니다? – RobMasters

+0

나는 조금 더 파고를했으며 거의 ​​2 년 전부터 다음 문제 보고서를 발견했습니다 : [http://www.doctrine-project.org/jira/browse/DDC-707](http://www.doctrine -project.org/jira/browse/DDC-707) 해결 된 버그의 중복으로 표시되었지만 실제 문제가 간과 된 것 같습니다. – RobMasters

답변

14

롭, 실제로 상위 엔티티를 사용하고 식별자 값을 필터링하려고 할 때. 대신, 가져 오려는 하위 엔티티에 상대적인 저장소에서 작업하십시오. 교리는 당신을 위해 나머지를 할 것입니다. 그래서 당신의 경우에 StoryThread에 대한 저장소를 얻고 싶습니다.

$repository = $this->em->getRepository('JoeCommentBundle:StoryThread'); 
return repository->find($id); 
+0

그 마술을 했어! :) – RobMasters

10

표준 엔티티 속성으로 판별 자 열을 사용할 수 없습니다.

대신 다음을 수행 할 수 있습니다

$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(); 
+1

아하 나는 그것을 명심해야한다. 하지만 실제로 관련 저장소의 find 메소드를 사용하는 것이 더 쉬웠다. – RobMasters

+0

때로는 충분하지 않습니다. 예를 들어, 2 개 또는 3 개의 엔티티 유형을 선택하거나 유형별로 순서를 선택해야하는 경우. – Gedrox

+4

FYI :'INSTANCE OF (: type1, : type2, ...) '를 사용하여 여러 유형을 선택할 수 있으므로 결과에 포함시키려는 각 클래스에 대해 여러 개의'INSTANCE OF' 함수 호출을 연결할 필요가 없습니다 . – flu

관련 문제