这是舞台:
Linux debian与Symfony2.5.6 / Doctrine2通过(FreeTDS DB-lib)连接到Sql Server。
intellectsoft-uk/MssqlBundle Driver安装并运行正常。
表/字段名称中包含spaces
的两个与SQL Server相关的表(抱歉,我无法发布图像):
´
dbo.MYCOMPANY$Item
No. - varchar(32)
Description - varchar(32)
dbo.[MYCOMPANY$Item Variant]
Code - varchar(32)
Item No. - varchar(32)
´
注意:是的......这是一种可怕的命名方式,Dynamics Nav和微软是违法者。
两个Doctrine的实体映射此表,OneToMany
关系指向Item Variant
实体的Item
实体:
/**
* @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
......但没什么
¿有什么建议吗? THX ...
答案 0 :(得分:0)
也许你应该在表和字段名称中使用`(在注释中)?
答案 1 :(得分:0)
你不能使用非[a-zA-Z0-9 _] +字符,它们会破坏几个SQL语句。
这些列名有问题吗?许多数据库支持对语义映射到某些表的视图的所有CRUD操作。您可以为所有有问题的表和列名创建视图,以避免遗留的引用噩梦。
所以列名称中的空格“Item No.”是遇到的问题的根源 或者更具体地说,这里the line of code阻止连接列具有空格“”字符。
因此,建议按@Karol和@xhostar的建议为这些表创建视图。