我有两个具有oneToMany关系的实体:
发布实体:
...
oneToMany:
images:
mappedBy: post
targetEntity: Shop\Bundle\ManagementBundle\Entity\Image
图片实体:
...
manyToOne:
post:
targetEntity: Shop\Bundle\ManagementBundle\Entity\Post
inversedBy: images
joinColumn:
onDelete: cascade
使用$entity
Post
实例,当我在$entity->getImages()
时,我收到的内容如下:
object(Doctrine\ORM\PersistentCollection)[65]
private 'snapshot' =>
array (size=0)
empty
private 'owner' =>
object(Acme\Bundle\ImageUpBundle\Entity\Post)[54]
private 'id' => int 41
private 'title' => string 'kbd' (length=3)
private 'images' =>
&object(Doctrine\ORM\PersistentCollection)[65]
private 'association' =>
array (size=15)
'fieldName' => string 'images' (length=6)
'targetEntity' => string 'Shop\Bundle\ManagementBundle\Entity\Image' (length=38)
'mappedBy' => string 'post' (length=4)
'type' => int 4
'inversedBy' => null
'isOwningSide' => boolean false
'sourceEntity' => string 'Shop\Bundle\ManagementBundle\Entity\Post' (length=37)
'fetch' => int 2
'cascade' =>
array (size=0)
empty
'isCascadeRemove' => boolean false
'isCascadePersist' => boolean false
'isCascadeRefresh' => boolean false
'isCascadeMerge' => boolean false
'isCascadeDetach' => boolean false
'orphanRemoval' => boolean false
private 'em' =>
....
但现在我不幸得到null
。
我真的尽力弄清楚可能导致此类问题的原因。非常感谢您的帮助。
修改
给定一个整数$ id,我使用:
获取一个Post实体$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('ShopManagementBundle:Post')->find($id);
我成功获得了Post实体的所有属性,但images
除外。
答案 0 :(得分:1)
$entity = $em->getRepository('ShopManagementBundle:Post')->find($id);
默认情况下,您将只获取子实体的代理对象,这种获取关联实体的懒惰方式称为延迟加载,它将从图像实体获取值,只调用其getter方法调用,如< / p>
$entity->getImage();
要一次加载所有关联实体,您应该指示学说进行急切加载。这可以使用DQL完成,遗憾的是它无法指示使用find方法
$query = $em->createQuery("SELECT p FROM Shop\Bundle\ManagementBundle\Entity\Post p");
$query->setFetchMode("Shop\Bundle\ManagementBundle\Entity\Post", "images", \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER);
$query->execute();
答案 1 :(得分:1)
以下是解决我问题的方法:
1-我在配置文件中的一个oneToMany
参数下收集了所有One To Many关联。换句话说,而不是:
oneToMany:
images:
targetEntity....
....
oneToMany:
messages:
targerEntity...
....
我会:
oneToMany:
images:
targerEntity...
....
messages:
targerEntity...
....
app/console doc:gen:entities
再次生成实体,只有一个构造函数构造了两个ArrayCollection
。/** * Constructor */ public function __construct() { $this->messages = new \Doctrine\Common\Collections\ArrayCollection(); $this->images = new \Doctrine\Common\Collections\ArrayCollection(); }
现在当我调用$em->getRepository('ShopManagementBundle:Post)->find($id)
时,我的子实体(Images
)附加到我的父实体(Post
)当数据库中存在具体记录时,而不是Null。当我使用new Post()
对新实体进行实例化时,我有空的ArrayCollection而不是Null。
我知道这个答案缺乏编程逻辑,似乎是随心所欲的努力,但我是为了共享而写的,有人突然遇到这个问题(正如我所做的那样)。我希望它有所帮助。
答案 2 :(得分:0)
确保您的列名,成员名和方法命名所有语法对齐。例如'searchCampaignType':
ORM专栏:searchCampaignTypeId
成员:$ searchCampaignType
Getter:getSearchCampaignTypes
Setter:setSearchCampaignTypes
采取的其他步骤:
问题是oneToMany。下面的示例是ManyToMany,但原理是相同的。
/**
* @ORM\ManyToMany(targetEntity="CampaignType")
* @ORM\JoinTable(name="Roles__SearchCampaignTypes",
* joinColumns={@ORM\JoinColumn(name="roleId", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="searchCampaignTypeId", referencedColumnName="id")}
* )
**/
private $searchCampaignTypes;
/**
* @return ArrayCollection
*/
public function getSearchCampaignTypes()
{
return $this->searchCampaignTypes;
}
/**
* @param $searchCampaignTypes
*/
public function setSearchCampaignTypes($searchCampaignTypes)
{
$this->searchCampaignTypes = $searchCampaignTypes;
}
答案 3 :(得分:0)
感谢 @satdev86 由于代理的提示,我可以通过仅使用 orm:generate-proxies
重新生成代理来解决我的问题。