我的应用程序中有两个简单的实体:产品和分类,它们与ManyToOne关系相关:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Product
*
* @ORM\Table(name="product")
* @ORM\Entity
*/
class Product
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="description", type="text")
*/
private $description;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
* @ORM\KoinColumn(onDelete="CASCADE")
*/
private $category;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Product
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set description
*
* @param string $description
*
* @return Product
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @return int
*/
public function getCategory()
{
return $this->category;
}
/**
* @param int $category
*/
public function setCategory($category)
{
$this->category = $category;
}
}
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity
*/
class Category
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Category
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
}
该关系正在工作,fine.But --有一个problem.When,我试图通过以下方法从DB获取对象
public function indexAction(){
$products = $this->getDoctrine()
->getRepository('AppBundle:Product')
->findAll();
echo "<pre>";
print_r($products);die;
}
它返回代码的语气,比如:
Array
(
[0] => AppBundle\Entity\Product Object
(
[id:AppBundle\Entity\Product:private] => 1
[name:AppBundle\Entity\Product:private] => Samsung Galaxy S5
[description:AppBundle\Entity\Product:private] => Stylish and elegant!
[category:AppBundle\Entity\Product:private] => Proxies\__CG__\AppBundle\Entity\Category Object
(
[__initializer__] => Closure Object
(
[static] => Array
(
[entityPersister] => Doctrine\ORM\Persisters\Entity\BasicEntityPersister Object
(
[class:protected] => Doctrine\ORM\Mapping\ClassMetadata Object
(
[name] => AppBundle\Entity\Category
[namespace] => AppBundle\Entity
[rootEntityName] => AppBundle\Entity\Category
[customGeneratorDefinition] =>
[customRepositoryClassName] =>
[isMappedSuperclass] =>
[isEmbeddedClass] =>
[parentClasses] => Array
(
)
[subClasses] => Array
(
)
[embeddedClasses] => Array
(
)
[namedQueries] => Array
(
)
[namedNativeQueries] => Array
(
)
[sqlResultSetMappings] => Array
(
)
还有更多,这是不可能在这里完全呈现的。如果有人建议我如何摆脱所有这些不必要的数据,只接收我对象的属性,我将非常感激。提前谢谢。
发布于 2017-07-28 00:52:57
这是因为Doctrine在默认情况下将关联作为代理加载,而代理是对实际实体的引用。然后,当您尝试从该关联中获取某些信息时,Doctrine实际上会从数据库中获取数据并将其注入水。这通常被称为“延迟加载”,对于提高性能非常有用。
要解决这个问题,必须在关联中设置急切的获取模式:
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products", fetch="EAGER")
*/
private $category;
发布于 2017-07-28 00:55:19
您可以使用查询生成器。
$qb = $repository->createQueryBuilder('p')->getQuery()->getArrayResult();
作为数组获得结果
发布于 2017-07-28 03:40:15
为此使用Symfony序列化程序(或JMS序列化程序)。
例如,您可以简单地将输出配置为实体的各种字段集(使用序列化组),隐藏某些字段并仅显示相关实体的ID。
基本文件如下:
https://stackoverflow.com/questions/45368802
复制