Преобразование результата запроса в массив массивов

$shops = $this->em->getRepository('models\Shop')->findAll();

Дает мне массив с сущностями, но мне нужен массив как массив.

Как преобразовать объект в массив?

Ответ 1

У меня была та же проблема. return get_object_vars($this) не является хорошим решением, потому что он также преобразует внутренний объект/свойства доктрины. После некоторых исследований я нашел этот класс: EntitySerializer, который создает чистый массив или JSON из ваших объектов и удаляет ненужные элементы. Документация находится здесь. Например, я использовал следующий код:

$patientProfile = $this->em->getRepository('Entities\Patientprofile')->findOneByuserid('2222222');
$entitySerializer=new Bgy\Doctrine\EntitySerializer($this->em);
$patientProfile=$entitySerializer->toArray($patientProfile);

Ответ 2

Doctrine позволяет вам указать режим гидратации при выполнении запросов, которые позволяют вам изменить тип данных возвращаемых результатов. В этом случае вам нужен Query:: HYDRATE_ARRAY. Это не позволяет указать это по методу findAll() по умолчанию, найденному в репозиториях. Вам нужно будет написать свой собственный DQL для него.

Если вам нужна коллекция entites как массивы:

$query = $em->createQuery('SELECT u FROM User u');
$entites = $query->execute(array(), Query::HYDRATE_ARRAY);

// If you don't have parameters in the query, you can use the getResult() shortcut
$query = $em->createQuery('SELECT u FROM User u');
$entities = $query->getResult(Query::HYDRATE_ARRAY);

Если вам нужна отдельная сущность в виде массива, например. для определенного идентификатора:

$query = $em->createQuery('SELECT u FROM User u WHERE u.id = ?1');
$query->setParameter(1, $id);
$entity = $query->getSingleResult(Query::HYDRATE_ARRAY);

Эти методы определены на Query и AbstractQuery.