2017-04-06 328 views
1

我正在將Doctrine2整合到CodeIgniter中。如何將Doctrine數組轉換爲PHP關聯數組

我的實體類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 
} 

當我使用$消息= $這個 - > EM-> getRepository('實體:新聞「) - >的findAll()在News_model類和印刷,後續代碼var_dump($消息),我得到的對象(模型數組\實體\新聞),就像如下:

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) 
) 

我怎麼能轉換主義實體對象(第一顯示陣列)導致的PHP關聯數組(第二顯示陣列)?

回答

2

您正在使用Doctrine ORM。 ORM意味着對象關係映射器。你使用ORM是因爲你想獲得結果作爲對象。否則,你最好開始閱讀關於Doctrine DBAL。 那麼這條線:

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

如果您使用的findAll(),那麼你希望的對象的集合。在學說中,我們討論的是collections而不是數組。

這些集合可以像普通數組一樣簡單地通過foreach遍歷。然後你可以使用每個對象具有一定的好處的內部集合:特殊的直接調用一些自定義的方法

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

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

謝謝,我適應與對象的工作的看法。 – omixam

0

我@Frank B,您使用的原則同意的理由是,你得到的對象,而不是一個工作魔法陣列。

但是,如果您設置了數組,則可以使用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']]); 
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(); 
    } 
}