我将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关联数组(第二个显示数组)?
答案 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']]);