Я пытаюсь реализовать тип взаимодействия модель / картограф с использованием Doctrine DBAL, но столкнулся с несколькими вопросами. У некоторых из моих имен столбцов есть знак «#» в конце. Изменение имени не вариант. Синтаксис $ {‘COL1 #’} прекрасно работает для обычных переменных, но PHP, похоже, испытывает трудности с использованием его в качестве свойства объекта.
Ошибка разбора: синтаксическая ошибка, неожиданный ‘$’, ожидаемая переменная (T_VARIABLE in …
Как мне получить модель таблицы с хэштегом в имени поля?
Вы могли бы создавать представления в MySQL и переименуйте ваши столбцы во что-то более дружелюбное в этих представлениях (что-то без #
) …? Таким образом, вам не придется изменять исходные таблицы, но вы все равно можете обойти эти проблемы с именами.
Учение также поддерживает использование просмотров для вашей модели.
Многие базы данных поддерживают все операции 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