Доктрина 2.1 - Изменение отображения поля (атрибута сущности) на лету - PullRequest
2 голосов
/ 26 октября 2011

Безопасно ли изменить имя столбца базы данных на лету в отображении Doctrine в загрузчике приложения на случай, если я сделаю это для всех созданных менеджеров сущностей?

<?php
// In "every second" view sort by score2 instead of by score1 
if (rand(0, 1) % 2 === 0) {
   $entityManager->getMetadataFactory()->getMetadataFor('Advertisement')->fieldMappings['score']['columnName'] = 'score2';
}

Атрибут Score используется для сортировки отображаемых объектов, и я хотел бы выполнить A / B-тестирование сортировки по различным столбцам базы данных самым простым способом.

1 Ответ

2 голосов
/ 27 октября 2011

Ладно, похоже, у меня есть решение.

Вероятно, лучший способ - создать собственный ClassMetadataFactory , расширенный с \ Doctrine \ ORM \ Mapping \ ClassMetadataFactory и создайте EntityManager с помощью этого ClassMetadataFactory.

<?php
/**
 * Implementation of Doctrine's metadata factory class for A/B testing
 */
class ClassMetadataFactory extends \Doctrine\ORM\Mapping\ClassMetadataFactory
{
    /**
     * Gets the class metadata descriptor for a class.
     *  
     * @param string $className The name of the class.
     * @return Doctrine\ORM\Mapping\ClassMetadata
     */
    public function getMetadataFor($className)
    {
        $metadata = parent::getMetadataFor($className);

        if ($className === 'Advertisement' || $className === '\Advertisement') {
            $metadata->fieldMappings['score']['columnName'] = 'score2';
            $metadata->fieldNames['score'] = 'score2';
            $metadata->columnNames['score'] = 'score2';
        }

        return $metadata;
    }
}

Еще одна вещь, о которой вы должны знать, это DQL-кеш Doctrine!

Это довольно глупый пример.Следующим шагом может быть настройка A / B-тестирования и некоторых коммутаторов, отвечающих за вариант решения, но это не входит в тему моего вопроса выше.

...