Доктрина 2: отношение отображения ошибок из таблиц Sql Server с пробелами в именах полей

0

Это этап:

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 

... но ничего

Любое предложение? Спасибо...

Теги:
sql-server
pdo
doctrine2

2 ответа

0

Цитата из документации Doctrine:

Вы не можете использовать символы non [a-zA-Z0-9 _] +, они разбивают несколько операторов SQL.

Возникли проблемы с такими именами столбцов? Многие базы данных поддерживают все операции CRUD в представлениях, которые семантически сопоставляются с определенными таблицами. Вы можете создавать представления для всех проблемных таблиц и имен столбцов, чтобы избежать устаревших кошмаров котировок.

Таким образом, пространство в столбце "Пункт №" является источником проблемы.
Или, более конкретно, здесь строка кода предотвращает столбцы соединения от символа пробела.

Поэтому создавать представления для этих таблиц, как рекомендовано @Karol, и @xhostar - это рекомендуемый способ.

0

Может быть, вы должны использовать 'в именах таблиц и полей (в аннотациях)?

  • 0
    Да, я пытался изменить скобки для символа `(` Item No_` вместо [Item No_] и так далее ...), но все еще имею ту же проблему.
  • 0
    Как насчет объединения `и [? Последнее, что вы можете сделать, это создать представления для таблиц с пробелами в именах или именах столбцов, которые изменят имена на форму DoctrineReadable.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню