原则 2:字段名称中包含空格的 Sql Server 表中的错误映射关系


Doctrine 2: error mapping relation from Sql Server tables with spaces in field's names

这是阶段

Linux debian with Symfony2.5.6/Doctrine2 通过 (FreeTDS DB-lib) 连接到 Sql Server。

intellectsoft-uk/MssqlBundle 驱动程序已安装并运行正常。

两个与 SQL Server 相关的表,表/字段名称中带有spaces(抱歉,我无法发布图像):

´
dbo.MYCOMPANY$Item
    No.         - varchar(32)
    Description - varchar(32)
dbo.[MYCOMPANY$Item Variant]      
    Code         - varchar(32)    
    Item No.     - varchar(32)
´

注意:是的...这是一种可怕的命名风格,Dynamics Nav和微软是罪犯。


两个教义的实体将此表映射到指向Item实体Item Variant OneToMany关系:

/**
 * @ORM'Table(name="dbo.MYCOMPANY$Item")
 * @ORM'Entity
 */
class Item
{
    /* @ORM'Id 
     * @ORM'Column(name="[No_]", type="string", length=32) 
     */
    private $no;
    /**
    *  @ORM'Column(name="Description", type="string", length=128) 
     */
    private $description;
    /* @ORM'OneToMany(
     *     targetEntity="DymamicsBundle'Entity'ItemVariant", 
     *     mappedBy="item", cascade={"persist","remove"}) 
     */
    private $itemVariants;
}
/**
 * @ORM'Table(name="dbo.[MYCOMPANY$Item Variant]")
 * @ORM'Entity
 */
class ItemVariant
{
    /* @ORM'Id 
     * @ORM'Column(name="Code", type="string", length=32, nullable=false) 
     */
    private $code;
    /**
     * @ORM'Id
     * @ORM'ManyToOne(
     *    targetEntity="DymamicsBundle'Entity'Item", 
     *    inversedBy="itemVariants")
     * @ORM'JoinColumn(
     *     name="[Item No_]", 
     *     referencedColumnName="[No_]", onDelete="CASCADE")
     */
    private $item;
}

在控制器中,我查询一个项目 XXXXXX:

/** @Template() */
public function helloAction($name)
{
    $item = $em->getRepository("DynamicsBundle:Item")->findByNo('XXXXXX');
    return array('item' => $item);
}

index.html.twig模板中,我打印字段没有问题:

{% block content %}
    {{ item.no }}
    {{ item.description }}
{% endblock %}

。现在的问题是:

如果我尝试访问会员itemVariants...

{% block content %}
    {{ item.no }}
    {{ item.description }}
    This item has {{ item.itemVariants.count }} variants
    {% for v in item.itemVariants %}
        <p>{{ v.code }}</p>
    {% endfor %}
{% endblock %}

我得到这个致命错误

> 
> An exception has been thrown during the rendering of a template
> ("Unrecognized field: t0.[Item No_]") in
> .../DynamicsBundle/Resources/views/Demo/index.html.twig at line 2.
> 

一个经过测试的解决方案(对我来说不可行,因为我无法修改 Dynamics Nav 数据库字段):

重命名表中的Item No.字段dbo.[MYCOMPANY$Item Variant]...即 ItemNo......问题已解决:

class ItemVariant
{
    ...
     * @ORM'JoinColumn(
     *     name="ItemNo", 
    ...
    private $item;
}

输出:

This item has 2 variants
red
blue

因此。。。问题似乎是Item No.字段名称

我尝试在 SQL Server 数据库中更改此参数:

ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNINGS ON
ARITHABORT ON
QUOTED_IDENTIFIER ON
CONCAT_NULL_YIELDS_NULL ON
NUMERIC_ROUNDABORT OFF 

。但什么都没有

¿有什么建议吗? 谢谢...

也许您应该在表和字段名称中使用 ' (在注释中)?

引自教义文档:

不能使用非 [a-zA-Z0-9_]+ 字符,它们会破坏多个 SQL 语句。

对这些列名称有问题?许多数据库支持对语义映射到某些表的视图执行所有 CRUD 操作。您可以为所有有问题的表和列名称创建视图,以避免遗留引用的噩梦。

因此,列名称"项目编号"中的空格是遇到问题的根源.
或者更具体地说,这里是防止连接列具有空格"字符的代码行。

因此,按照@Karol的建议为这些表创建视图,建议使用 @xhostar 方法。