【问题标题】:How to get a Doctrine2 result object as an associative array?如何将 Doctrine2 结果对象作为关联数组?
【发布时间】:2011-08-31 15:17:10
【问题描述】:

我有一个简单的实体,它是一个包含我的用户数据的表格 我想将特定用户的所有列作为数组获取,然后对它们进行 json_encode,但我得到的是一个实体对象,我必须对每个值使用 get 方法。我只想要一个用户表值的关联数组。 我试过但没有用的代码(返回的实体对象)如下: 1.

$qb = $this->em->createQueryBuilder();
$qb->add('select', 'a')
->add('from', 'Entities\Adminprofile a')
->add('where', 'a.userid = 3333');
$accounts = $qb->getQuery()->getResult();

2.

$account = $this->em->getRepository('Entities\Adminprofile')->findOneBy(
array('userid' => '3333'));

PS:我使用的是z2d2项目,它是doctrine2与Zend框架的集成。

【问题讨论】:

    标签: zend-framework doctrine doctrine-orm


    【解决方案1】:

    当您执行$accounts = $qb->getQuery()->getResult(); 时,您传递给 getResult 的参数告诉它如何水合将返回的结果集。

    阵列水化

    如果你想要数组,那么你应该传递CONSTANT 用于数组水合Doctrine\ORM\Query::HYDRATE_ARRAY

    $accounts = $qb->getQuery()->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY);

    如果您使用的是findOneBy(),那么它将总是返回一个实体。由于 find 工作原理的内部结构,您不能告诉它通过返回实体以外的任何其他方式来补充水分。

    在这种情况下,您需要做的是在您的实体内创建一个 getValues() 方法,该方法返回您的实体数组,如下所示:

     public function getSimpleValues(){
         return array(
            'id'      => $this->getId(),
            'lft'     => $this->getLft(),
            'rgt'     => $this->getRgt(),
            'name'    => $this->getName(),
            'md5Name' => $this->getMd5Name(),              
            'owner'   => $this->getOwner()->getId(),
            'etag'    => $this->getEtag()
        );
    }
    

    水合 API 文档:http://www.doctrine-project.org/api/orm/2.1/namespace-Doctrine.ORM.Internal.Hydration.html

    【讨论】:

    • 感谢您快速准确的回复。不同水合模式的常量为:Query::HYDRATE_OBJECT Query::HYDRATE_ARRAY Query::HYDRATE_SCALAR Query::HYDRATE_SINGLE_SCALAR
    • 如果我想像$this->doctrine->em->find('Entity\User',5)一样使用呢?
    【解决方案2】:

    您还可以使用 getArrayResult() 作为传入常量以获取数组的快捷方式:

    $accounts = $qb->getQuery()->getArrayResult();
    

    【讨论】:

      【解决方案3】:

      您应该使用包含值 2 的常量,它是内置的,您可以在查询的最后部分这样做

      $qb->getQuery()->getResult( Doctrine\ORM\Query::HYDRATE_ARRAY );
      

      【讨论】:

        【解决方案4】:
        $data = $this->entity->findOneBy(array('key' => $value));
        
        $hydrator = new \DoctrineModule\Stdlib\Hydrator\DoctrineObject($this->_em, $entity_name);
        
        $array = $hydrator->extract($data);
        

        【讨论】:

        • 这不是问题的答案。
        • 因为这是使用 laminas(以前的 zend 框架)时唯一正确的答案,所以应该在 2021 年更新。laminas-hydrator 组件(模块)带来了类,可以轻松地将数据水合到对象或从初始化对象中提取数据。 Doctrine 带来了它自己的 hydrator,名为 DoctrineObject,它继承自 Laminas AbstractHydrator 类。使用数据对象作为参数执行DoctrineObject::extract() 方法会导致预期的结果:带有来自对象的数据的关联数组。
        • 2021年电话:(new DoctrineObject($entityManager))->extract($entity);
        猜你喜欢
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多