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



我正在将Doctrine2集成到CodeIgniter中。

我的实体类新闻.php

<?php
namespace ModelsEntities;
/**
 * 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 ModelsEntitiesNews;
class News_model extends CI_Model {
    //Model code here
}

当我在类News_model中使用$news = $this->em->getRepository('Entities:News'(->findAll((并打印var_dump($news(时,我得到一个对象数组(Models\Entities\News(,如下所示:

array (size=6)
  0 => 
    object(ModelsEntitiesNews)[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)
 )

如何将原则实体对象(第一个显示的数组(结果转换为 PHP 关联数组(第二个显示的数组(?

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

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

如果你使用 findAll((,那么你需要一个对象的集合。在教义中,我们谈论集合而不是数组。

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

$newitems = $this->em->getRepository('Entities:News')->findAll();
foreach($newsitems as $newsitem)
{
    echo '<h3>' . $newsitem->getTitle() . '</h3>';
}

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

在控制器中:

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

在您的类存储库中:

class NewsRepository extends DoctrineORMEntityRepository
{
    public function yourMethodName()
    {
        $query = $this->createQueryBuilder('n');
        /***/
        return $query->getQuery()->getArrayResult();
    }
}

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

但是,如果你设置了一个数组,你可以使用Symfony序列化程序将任何对象转换为数组。

只需向实体添加一些注释:

use SymfonyComponentSerializerAnnotationGroups;
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']]);

相关内容

  • 没有找到相关文章

最新更新