获取子实体返回null而不是arrayCollection对象

时间:2016-01-11 15:38:30

标签: symfony doctrine

我有两个具有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除外。

4 个答案:

答案 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...
      ....
  1. 我使用app/console doc:gen:entities再次生成实体,只有一个构造函数构造了两个ArrayCollection
  2. /**
         * 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

采取的其他步骤:

  • 重新生成您的Doctrine Proxies
  • 如果您正在使用memcached,请确保重新启动它或 重建数据

问题是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 重新生成代理来解决我的问题。