【发布时间】:2016-03-04 23:51:05
【问题描述】:
假设我有一个名为User 的实体,它具有一些属性,例如firstName, lastName, age 和Posts 的集合。
有没有办法使用EntityManager 和Find 方法加载这个User 实体而不加载所有属性/集合?
我正在使用REST API 来检索User,并且我想分开通话:
-
api/user/1 - 应仅使用
firstName, lastName and age检索User对象。 -
api/user/1/posts - 应该检索带有属性的
User对象和Posts的集合。
我知道我可以使用 QueryBuilder 并创建单独的方法来检索所需的数据,但我希望这样:
场景:
api/user/1
$userId = 1;
$user = getEntityManager()->find('entity\User', $userId);
return $user; // should only load the firstName, lastName, age properties.
api/user/1/posts
$userId = 1;
$user = getEntityManager()->find('entity\User', $userId);
return $user->getPosts(); // should load the firstName, lastName, age properties and the collection of posts.
我已经尝试过内置 Doctrine 的“Extra Lazy Load”功能,但没有任何结果。
我的代码:
<?php
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name = "USER")
*
* @JMS\ExclusionPolicy("all")
* @JMS\AccessorOrder("custom", custom = { "id", "firstName", "lastName" })
*/
class User {
/**
* @ORM\Id
* @ORM\Column(name = "id", type = "integer", options={"unsigned"=true})
* @ORM\GeneratedValue(strategy = "IDENTITY")
* @JMS\SerializedName("id")
* @JMS\Expose
* @JMS\Type("integer")
* @var int
*/
private $id;
/**
* @ORM\Column(name = "firstName", type = "string", length = 255)
* @JMS\SerializedName("firstName")
* @JMS\Expose
* @JMS\Type("string")
* @var string
*/
private $firstName;
/**
* @ORM\Column(name = "lastName", type = "string", length = 255)
* @JMS\SerializedName("lastName")
* @JMS\Expose
* @JMS\Type("string")
* @var string
*/
private $lastName;
/**
* @ORM\OneToMany(targetEntity = "Post", mappedBy = "user", cascade = { "persist" }, fetch="LAZY")
* @JMS\Expose
* @var ArrayCollection<Post>
*/
private $posts;
public function getId() {
return $this->id;
}
public function getFirstName() {
return $this->firstName;
}
public function getLastName() {
return $this->lastName;
public function getPosts() {
return $this->posts->toArray();
}
}
帖子总是在获取用户对象后加载,即使我使用获取类型lazy或extra_lazy。
【问题讨论】:
-
只要您使用延迟加载的集合定义了您的实体(例如,您的用户实体中的帖子)并且您没有访问未加载的用户的帖子。所以你必须提供更多细节,但我们为让它运行付出了很多努力,所以我也许可以提供帮助。
-
@LBA 添加了用户类!
-
大胆猜测:也许延迟加载会受到
$this->posts->toArray()的阻碍(你的转换用例是什么?我总是将它们保留为ArrayCollection)。您能否尝试将帖子返回为$this->posts,并确保没有人可以访问帖子。 -
@k0pernikus 删除 toArray() 或 getPosts() 方法都不起作用...我只是调用 getEntityManager()->find('namespace', $id);当我在 JSON 中回显时,它还会显示帖子...
-
您是否对整个用户对象进行了 JSON 编码?可能是序列化触发了延迟加载。
标签: php doctrine-orm doctrine