Doctrine DBAL ->execute() и Hydration с именами полей DB2, включая '#'

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Если ваша база данных действительно старая (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
Другие вопросы по тегам