【问题标题】:PHP: Symfony2 Doctrine "The discriminator column "discr" is missing" HydrationException with filterPHP:Symfony2 Doctrine“鉴别器列“discr”缺失”带过滤器的 HydrationException
【发布时间】:2014-09-02 07:43:02
【问题描述】:

各位程序员:)

我的情况很糟糕,不知道发生了什么。

这涉及两个实体: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”缺少鉴别器列“discr”。对于这个查询。

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

那么,如果有人知道:究竟是什么原因造成的,如何解决?

提前谢谢你:)

【问题讨论】:

  • 兄弟...你解决了吗?
  • 我没有。必须保留 JOIN w.files 删除,因为我没有找到解决这个问题的其他方法。
  • 表中的空值是我的问题
  • 以下答案可能对如何解决此问题有所帮助。 discriminator-column-to-a-field-with-doctrine-2

标签: symfony inheritance filter doctrine-orm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2022-01-23
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多