PHP:Symfony2 Doctrine“鉴别器列”“缺少”带有过滤器的HydrationException

时间:2014-07-04 05:00:46

标签: symfony inheritance filter doctrine-orm

其他程序员:)

我有一个不知道发生了什么事的坏情况。

这涉及两个实体:WareFile。 在我的存储库中,我有一个函数返回File个对象和商品以避免延迟加载:

此函数的相关部分(因为即使我仅触发此位也会发生异常)是:

public function findByWithFilesTotal($params, $page = false, $per_page = false){

    $res = $this->_em->createQuery('SELECT w, f FROM ShopBundle:Ware w JOIN w.files f');
    // same result occurs with LEFT JOIN
    return count($res->getResult());
}

重要的东西: 1)Ware和File类是类Data的直接后代。鉴别家都没事。

2)Ware与File具有OneToMany关系 - 这意味着File表具有ware_id列。

3)这是最重要的部分(恕我直言)。我使用此过滤器来分隔所有Data后代中的已删除项目。

class UndeletedFilter extends SQLFilter
{
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {

        if(!$targetEntity->hasField('deleted'))
            return "";

        return "( $targetTableAlias.deleted = 0 OR $targetTableAlias.deleted IS NULL)";     
    }
}

它适用于所有其他实体,但会导致HydrationException,并使用DQL别名“f”消息“Acme \ CoreBundle \ Entity \ File”缺少“鉴别器列”"RES“。对于这一个查询。

但是,如果我从DQL查询中删除JOIN w.files并将其保留为延迟加载,或者从addFilterConstraint()方法返回空字符串,即使它确实已删除,也不会发生这种情况'field。

所以,如果有人知道:究竟是什么导致了这一点,以及如何解决它?

提前谢谢你:)

1 个答案:

答案 0 :(得分:3)

在您使用固有类时触发此异常的一个原因,例如,如果您的discriminator column具有null值,则QueryBuilder将不知道如何根据类型转换此未知类型