如何将Doctrine数组转换为PHP关联数组

时间:2017-04-06 20:43:28

标签: php arrays codeigniter symfony doctrine-orm

我将Doctrine2集成到CodeIgniter中。

我的实体类News.php

<?php

namespace Models\Entities;

/**
 * News
 *
 * @Table(name="news", indexes={@Index(name="slug", columns={"slug"})})
 * @Entity
 */
class News {
     //HERE: properties, getter, setter, etc.
}

我的模特类News_model.php

<?php
require_once(APPPATH."models/entities/News.php");
use Models\Entities\News;

class News_model extends CI_Model {
    //Model code here
}

当我在News_model类中使用$ news = $ this-&gt; em-&gt; getRepository(&#39;实体:新闻&#39;) - &gt; findAll()并打印时,var_dump($ news),I获取一个对象数组(Models \ Entities \ News),如下所示:

array (size=6)
  0 => 
    object(Models\Entities\News)[87]
      private 'id' => int 1
      private 'title' => string 'text here' (length=9)
      private 'slug' => string '' (length=0)
      private 'text' => string 'text here' (length=9)
      private 'news' => null
)

但我期待一个关联数组,如下面的代码:

array (size=6)
  0 => 
    array (size=4)
      'id' => string '1' (length=1)
      'title' => string 'text here' (length=9)
      'slug' => string '' (length=0)
      'text' => string 'text here' (length=9)
 )

如何将Doctrine Entity对象(首次显示数组)结果转换为PHP关联数组(第二个显示数组)?

3 个答案:

答案 0 :(得分:2)

您正在使用Doctrine ORM。 ORM表示对象关系映射器。您使用ORM是因为您希望将结果作为对象获取。否则你最好开始阅读Doctrine DBAL。 然后这一行:

 $news = $this->em->getRepository('Entities:News')->findAll();

如果使用findAll(),则需要一个对象集合。在Doctrine中,我们讨论collections而不是数组。

这些集合可以像普通数组一样简单地使用foreach。然后你可以使用集合中的每个对象,它们有一些好处:特别是直接调用一些自定义方法

$newitems = $this->em->getRepository('Entities:News')->findAll();

foreach($newsitems as $newsitem)
{
    echo '<h3>' . $newsitem->getTitle() . '</h3>';
}

答案 1 :(得分:1)

为什么不在类库中使用原生教义方法getArrayResult

在您的控制器中:

/***/
$news = $this->em->getRepository('Entities:News')->yourMethodName();
/***/

在您的类库中:

class NewsRepository extends \Doctrine\ORM\EntityRepository
{
    public function yourMethodName()
    {
        $query = $this->createQueryBuilder('n');

        /***/

        return $query->getQuery()->getArrayResult();
    }
}

答案 2 :(得分:0)

我同意@Frank B,你使用Doctrine的原因是你可以使用对象而不是魔术数组。

但是,如果您设置了数组,则可以使用Symfony Serializer将任何对象转换为数组。

只需在您的实体中添加一些注释:

use Symfony\Component\Serializer\Annotation\Groups;

class News {
    /**
     * @Groups({"group1"})
     */
    protected $id;

    /**
     * @Groups({"group1"})
     */
    protected $title;

    /**
     * @Groups({"group1"})
     */
    protected $slug;
}

然后你可以像这样转换你的数组:

$news = $this->em->getRepository('Entities:News')->findAll();
$serializer = $this->getContainer()->get('serializer');
$newsArray = $serializer->normalize($news, 'json', ['groups' => ['group1']]);