将查询结果转换为数组数组

PiT*_*ber 10 php doctrine-orm

$shops = $this->em->getRepository('models\Shop')->findAll();
Run Code Online (Sandbox Code Playgroud)

给我一个实体数组,但我需要实体作为数组.

如何将实体转换为数组?

K. *_*ert 16

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);
Run Code Online (Sandbox Code Playgroud)

如果您需要单个实体作为数组,例如.对于特定ID:

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

这些方法在QueryAbstractQuery上定义.

  • 但这使得使用抽象的EntityRepository-> findAll()方法是不可能的. (4认同)

Meh*_*nai 12

我遇到过同样的问题.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);
Run Code Online (Sandbox Code Playgroud)