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" => "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->getName()); array_push($myArray["description"], $article->getDescription());
以上是关于Symfony 2 Doctrine 导出到 JSON的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2-Doctrine:ManyToMany 关系未保存到数据库
Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库
Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移