Doctrine DBAL — & gt; execute () и Hydration с именами полей DB2, включая ‘#’

Я пытаюсь реализовать тип взаимодействия модель / картограф с использованием Doctrine DBAL, но столкнулся с несколькими вопросами. У некоторых из моих имен столбцов есть знак «#» в конце. Изменение имени не вариант. Синтаксис $ {‘COL1 #’} прекрасно работает для обычных переменных, но PHP, похоже, испытывает трудности с использованием его в качестве свойства объекта.

Ошибка разбора: синтаксическая ошибка, неожиданный ‘$’, ожидаемая переменная (T_VARIABLE in …

Как мне получить модель таблицы с хэштегом в имени поля?

4

Решение

Вы могли бы создавать представления в MySQL и переименуйте ваши столбцы во что-то более дружелюбное в этих представлениях (что-то без #) …? Таким образом, вам не придется изменять исходные таблицы, но вы все равно можете обойти эти проблемы с именами.

Учение также поддерживает использование просмотров для вашей модели.

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

Они ссылаются на другой сценарий, но может помочь то же решение с использованием представлений.

Как я понял, вы используете только Doctrine DBAL, но в любом случае здесь еще немного информации при использовании представлений MySQL с доктриной ORM это может быть полезно (вам или другим).

3

Другие решения

Я не вижу смысла в использовании Доктрины без сущностей.

Если ваша база данных действительно старая (40 лет, о боже!), Вы должны использовать абстрактный слой / структуру БД, такие как Zend DB (извините, вы используете ZF2) или Aura (http://auraphp.com/framework/1.x/en/sql/).

Но если вы действительно хотите использовать Doctrine, вы должны создавать сущности вручную и использовать магические сеттеры — геттеры для обработки специальных полей и доступа / гидратации ваших сущностей.

РЕДАКТИРОВАТЬ

Представь свою БД с таблицей Clients и 2 поля: id а также name#1

class Client
{
protected $id;
protected $name1;

public function __set()
{
// here you can set unknown properties
// remove '#' e.g ...
}

public function setName1($name1)
{
$this->name1 = $name1;

return $this;
}

public function getName1()
{
return $this->name1;
}

// ... other accessors

}

Использование :

$results = clients_query_result ...
$hydrator = new ClassMethods();
$clients = [];

foreach ($results as $result)
{
$client = new Client();
$clients[] = $hydrator->hydrate($result, $client);
}

// that's it, now you have a collection of Client objects
0

По вопросам рекламы [email protected]