Использование значения столбца как индекса массива в доктрине
Я использую doctrine 2.1 для создания модели для таблицы settings
:
id | arg | value | category
1 | name | foo | general_settings
2 | desc | bar | general_settings
Предположим, что у меня много настроек для разных категорий. Чтобы получить все настройки для определенной категории, я делаю что-то вроде этого:
$q = Doctrine_Query::create()
->from('Setting p')
->where('p.category = ?', $category_name);
Все отлично работает на этом этапе. Ну.. вопрос о 64 000 долларов:
Есть ли альтернатива доступа к данным, которая позволяет мне читать результат, как показано ниже?
$resultSet = $q->execute();
//the magic here could be use the -arg- column as index
$requested_setting = $resulSet['name']
//print the setting value
echo $requested_setting['value']; //should prints "foo"
//another way
echo $resulSet['desc']['value']; //should prints "bar"
Ответы
Ответ 1
Я понял: трюк здесь использует слово INDEX BY
.
Класс запроса
импортировать класс запроса (необязательно всегда):
use \Doctrine\ORM\Query;
создайте запрос:
$query = $this->data->em->createQuery('
SELECT s
FROM models\Setting s
INDEX BY s.arg //to set array custom key
WHERE s.category = :category');
$query->setParameter('category', 'general');
установить режим hidration для работы с массивами только для чтения
$settings = $query->getResult(Query::HYDRATE_ARRAY);
Отобразите значение:
echo $settings['desc']['value']; // prints "bar"
QueryBuilder
С помощью объекта QueryBuilder
вы можете установить индекс в инструкции from
:
$qb = $em->createQueryBuilder();
$qb->select('s');
$qb->from('models\Settings', 's', 's.arg'); // here the magic
$result = $qb->getQuery()->getResult();
Затем вы можете получить доступ к объекту как:
$description = $result['desc'];
$value = $description->getValue();
Ответ 2
FYI при использовании createQueryBuilder в вашем EntityRepository вы можете напрямую указать INDEX BY вместе с псевдонимом:
$this->createQueryBuilder('p', 'p.id')
Это позволяет избежать манипулирования вручную, из которого автоматически обрабатывается EntityRepositories.
Ответ 3
Функция Doctrine IndexBy используется для отображения значения столбца в качестве индекса массива.
$this
// database table alias
->createQueryBuilder( 'app_settings' )
// first parameter should be alias and second parameter will be column name, which you want to show as array index
->indexBy('app_settings','app_settings.name')
// get query
->getQuery()
// get doctrine result in array format
->getArrayResult();
Результат упомянутого запроса будет в следующем формате: Результат упомянутого запроса