Это этап:
Linux debian с Symfony2.5.6/Doctrine2, подключенный к серверу Sql через (FreeTDS DB-lib).
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 и Microsoft - нарушители.
Два объекта 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]
by... ie 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
... но ничего
Любое предложение? Спасибо...
Цитата из документации Doctrine:
Вы не можете использовать символы non [a-zA-Z0-9 _] +, они разбивают несколько операторов SQL.
Возникли проблемы с такими именами столбцов? Многие базы данных поддерживают все операции CRUD в представлениях, которые семантически сопоставляются с определенными таблицами. Вы можете создавать представления для всех проблемных таблиц и имен столбцов, чтобы избежать устаревших кошмаров котировок.
Таким образом, пространство в столбце "Пункт №" является источником проблемы.
Или, более конкретно, здесь строка кода предотвращает столбцы соединения от символа пробела.
Поэтому создавать представления для этих таблиц, как рекомендовано @Karol, и @xhostar - это рекомендуемый способ.
Может быть, вы должны использовать 'в именах таблиц и полей (в аннотациях)?