Symfony Get子实体返回null而不是arrayCollection对象
我有两个实体有一对一的关系: 邮政实体:Symfony Get子实体返回null而不是arrayCollection对象,symfony,doctrine,Symfony,Doctrine,我有两个实体有一对一的关系: 邮政实体: ... oneToMany: images: mappedBy: post targetEntity: Shop\Bundle\ManagementBundle\Entity\Image 图像实体: ... manyToOne: post: targetEntity: Shop\Bundle\ManagementBundle\Entity\Post invers
...
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实体的所有属性,除了来自图像的属性
$entity = $em->getRepository('ShopManagementBundle:Post')->find($id);
默认情况下,您将只获取子实体的代理对象,这种获取关联实体的延迟方式称为延迟加载,它将从images实体获取值,仅调用其getter方法,如
$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-我在配置文件中的一个oneToMany
参数下收集了所有一对多关联。换言之,与其拥有:
oneToMany:
images:
targetEntity....
....
oneToMany:
messages:
targerEntity...
....
我会:
oneToMany:
images:
targerEntity...
....
messages:
targerEntity...
....
我使用app/console doc:gen:entities
再次生成了实体,使得只有一个构造函数构造了两个ArrayCollection
s
现在,当我调用$em->getRepository('ShopManagementBundle:Post)->find($id)
时,当数据库中存在具体记录且不为空时,我将子实体(Images
)附加到父实体(Post
)。使用new Post()
初始化新实体时,ArrayCollection为空且不为Null
我知道这个答案缺乏编程逻辑,而且似乎是武断的,但我写它是为了在有人突然遇到这个问题时分享(就像我做的那样)。我希望它能有所帮助。确保您的列名、成员名和方法命名在语法上保持一致。例如“searchCampaignType”:
ORM列:searchCampaignTypeId
成员:$searchCampaignType
Getter:getSearchCampaignTypes
设置器:设置搜索活动类型
采取的其他步骤:
- 重新生成你的教义代理
- 如果您正在使用memcached,请确保重新启动它或
重建数据
这个问题很简单。下面的例子很多,但原理是一样的
/**
* @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;
}
多亏了@satdev86的代理提示,我可以通过使用orm:generate proxies
重新生成代理来解决我的问题。您使用的实体是否有相关的图像?@xabbuh,您是指数据库中的图像?如果是,是的。图像以正确的外键保存。然后您可以显示更多代码吗?例如,你如何获取实体?@xabbuh,谢谢你抽出时间,我已经编辑了OP,为你的最后一个问题添加了一个答案。我明白你的意思,先生,谢谢你通知我。然而,我不明白为什么懒惰的加载突然停止工作。即使是$entity->getImages()
现在也给出空值。在整个项目中,我将$entity
发送到twig模板,并在entity.images
上循环,现在这已被破坏。我将实施即时加载,但诚实地说…hm头痛为什么原始行为停止工作您在图像表中有足够的数据指向post表中的一行谢谢先生再次提供反馈。我想从现在到最后一次评论,我找到了解决办法。我会在这里分享它一旦我做了。感谢阿加尼张贴了解决方案,我希望它有帮助。再次感谢你花时间讨论我的问题。溴
/**
* @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;
}