Symfony 2 Doctrine 导出到 JSON

Posted

技术标签:

【中文标题】Symfony 2 Doctrine 导出到 JSON【英文标题】:Symfony 2 Doctrine export to JSON 【发布时间】:2011-10-24 04:53:39 【问题描述】:

我正在使用 Symfony 2 和 Doctrine 2 为 ios 应用程序创建 Web 服务 (JSON)。

要获取我的实体,我会这样做:

$articles = $this->getDoctrine()->getRepository('UdoPaddujourBundle:MenuArticle')->findAll();

我必须告诉你:

$article = array();
$article = $articles->toArray();

给我以下错误:

Fatal error: Call to a member function toArray() on a non-object

同样的事情发生在

$article = $articles->exportTo('json');

如何创建 json 响应?

亲切的问候, 卡瑙丹

编辑: var_dump($articles) =

array(18) 
   [0]=>
     object(Udo\PaddujourBundle\Entity\MenuArticle)#50 (4) 
    ["id":"Udo\PaddujourBundle\Entity\MenuArticle":private]=>
    int(1)
    ["name":"Udo\PaddujourBundle\Entity\MenuArticle":private]=>
    string(17) "My Article Name 1"
    ["description":"Udo\PaddujourBundle\Entity\MenuArticle":private]=>
    string(26) "My Article Description 1"
    ["price":"Udo\PaddujourBundle\Entity\MenuArticle":private]=>
    float(20)
    
   [1]=> ...

- 稍后编辑

如何遍历所有“属性名称”? 这就是我所拥有的:

$myarray=array(); 
$myArray["name"]=array(); 
$myArray["description"]=array(); 
foreach($articles in $article) 
 
  array_push($myArray["name"], $article->getName());
  array_push($myArray["description"], $article->getDescription()); 

【问题讨论】:

什么给了你var_dump($articles); array(18) [0]=> 对象(Udo\PaddujourBundle\Entity\MenuArticle)#50 (4) ["id":"Udo\PaddujourBundle\Entity\MenuArticle":private ]=> int(1) ["name":"Udo\PaddujourBundle\Entity\MenuArticle":private]=> string(17) "我的文章名称 1" ["description":"Udo\PaddujourBundle\Entity\MenuArticle" :private]=> string(24) "我的文章描述 1" ["price":"Udo\PaddujourBundle\Entity\MenuArticle":private]=> float(20) [1]=> 等等直到 [17] 什么给了你json_encode($articles); $articles 已经是 MenuArticle 对象的数组。 json_encode($articles) 给出:[,,,,,,,,]。我认为 json_encode 想要一个字符串数组而不是对象数组。 【参考方案1】:

如果您使用理论查询,您也可以这样做:

$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery('SELECT ma FROM UdoPaddujourBundle:MenuArticle ma ...etc');
$myArray = $query->getArrayResult();

然后使用json_encode($myArray);

更多详情请见here。

【讨论】:

感谢它的工作原理,但与“GetRepository()”方法相比它非常讨厌。但如果这是获得 json 响应的唯一简单方法,我必须处理它。 您可以将该方法移至自定义存储库,然后您就不必查看它了 ;-) 或者看看这个:***.com/questions/6706485/… 您确实希望使用您的对象而不是使用 DQL 查询。该界面更易于使用。【参考方案2】:

当您的实体(或任何其他对象)实现JsonSerializable时,您可以使用json_encode($articles)

<?php

namespace My\AppBundle\Entity;

use JsonSerializable;

class Channel implements JsonSerializable


    /*
     * All your fields, getters and setters.
     */

    /**
     * Returns serializable items.
     *
     * @return array
     */
    public function jsonSerialize()
    
        return [
            'name' => $this->getName(),
            'description' => $this->getDescription(),
        ];
    

【讨论】:

【参考方案3】:

如果您来自 symfony 1.x 背景,实体还有很多“魔法”可用,包括转换为数组的助手等等。

在 Symfony2 中,大部分魔法都消失了;特别是实体现在是普通的旧 PHP 对象,碰巧由 Doctrine 2 管理以持久保存到数据库,这意味着要在您的域对象上使用诸如 toArray() 之类的方法,您必须自己实现它们。这应该是相当简单的——只需返回一个带有("name of property" =&gt; "value of property")的键值数组...如果您与其他实体建立了关系,您还需要在这些实体上实现toArray()方法转换时只需从主实体调用它即可。

然后,一旦你有你的对象数组,$json = json_encode($array); 会给你一个 JSON 字符串作为你的响应发送。

【讨论】:

我怎样才能遍历所有的“属性名”?最好的 i 代码是 $myarray=array(); $myArray["name"]=array(); $myArray["description"]=array(); foreach($articles in $article) array_push($myArray["name"], $article-&gt;getName()); array_push($myArray["description"], $article-&gt;getDescription());

以上是关于Symfony 2 Doctrine 导出到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2-Doctrine:ManyToMany 关系未保存到数据库

Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

Doctrine 2,Symfony 2 中的独特约束

Symfony2,Doctrine,fixtures,数组到字符串的转换

如何在 Symfony 2 / Doctrine 中启用 ENUM