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;
    }