我正在将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']]);