首页 > 解决方案 > 准则 2.7.4:获取具有特定类型的实体

问题描述

我使用这样的实体X

/**
 * @Entity
 * @Table(name="x")
 */
class X {
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="smallint")
     */
    private $id;

    /**
     * @ManyToOne(targetEntity="Y")
     * @JoinColumn(name="y", referencedColumnName="id")
     */
    private $myY;
}

引用的类Y是多个子类的抽象基类。的$myY子类的实例之间不时发生变化Y

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="type", type="string")
 * @DiscriminatorMap({"UPLOAD" = "Y1", "PROCESSED" = "Y2", "ERROR" = "Y3"})
 * @Table(name="y")
 */
abstract class Y {

    /**
     * @Id
     * @GeneratedValue
     * @Column(type="smallint")
     */
    protected $id;

    /**
     * @Column(type="datetime")
     */
    protected $date;
}

/**
 * @Entity
 */
class Y1 extends Y {

    public function __construct() {
        $this->date = new \DateTime();
    }
} 

现在我尝试X从数据库中获取具有Y1as实例的所有实例$myY

$sql = array();
$sql[] = 'SELECT x';
$sql[] = 'FROM my\namespace\X x';
$sql[] = 'WHERE x.myY INSTANCE OF my\namespace\Y1';

$query = $this->em->createQuery(implode(' ', $sql));
$query->setFirstResult($offset);
$query->setMaxResults($maxResults);
return new Paginator($query);

但我得到一个 QueryException,似乎无法x.myYINSTANCE OF. 我该如何解决?

标签: doctrine-orm

解决方案


稍后进行一些测试:

$sql = array();
$sql[] = 'SELECT x';
$sql[] = 'FROM my\namespace\X x JOIN x.myY y';
$sql[] = 'WHERE y INSTANCE OF my\namespace\Y1';

$query = $this->em->createQuery(implode(' ', $sql));
$query->setFirstResult($offset);
$query->setMaxResults($maxResults);
return new Paginator($query);

似乎工作。


推荐阅读