Symfony2延迟加载不起作用

时间:2014-09-18 12:19:02

标签: php symfony doctrine-orm lazy-loading

我在symfony2 / doctrine2中有延迟加载的问题。 我有一个普通的对象(例如:type item),这个对象有一个id。如果我在运行时查看对象,我会看到id已设置。图标和金额等其他参数均为​​空。我知道,这是延迟加载的工作方式,但是当我调用getter(getIcon)时没有任何反应。图标属性仍为空。我也尝试调用__load方法,但它没有帮助。

抱歉,忘记了代码

class Character {
  /**
   * @ORM\Column(type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  protected $id;
  /**
   * @ORM\OneToMany(targetEntity="Entity\Item", mappedBy="character")
   */
  protected $item;

  /*********************************************************************
   * Custom methods
   */

  public function getItem() {
      return $this->item;
  }
}

这是延迟加载不起作用的对象。

class Item {
  /**
   * @ORM\Column(type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  protected $id;

  /**
   * @ORM\Column(type="integer")
   */
  protected $amount;

  /**
   * @ORM\Column(type="string")
   */
  protected $icon;
}

EDIT2:

字符类的构造函数

public function __construct()
{
    $this->item = new \Doctrine\Common\Collections\ArrayCollection();
}

1 个答案:

答案 0 :(得分:0)

那么您的初始帖子的主要评论指出,您需要在Item实体中实现ManyToOne关系,以使所有内容正常工作。

在你的角色实体中你有这行代码

/**
* @ORM\OneToMany(targetEntity="Entity\Item", mappedBy="character")
*/
protected $item;

这表示您与实体项目有关系,该实体项目在属性"字符"中突破关系。在此属性中存储关系。如果查看数据库,则无法找到任何存储的关系,因为类Item没有描述的映射属性字符。就像gp_sflover所指出的那样,OneToMany关系需要是双向的,并且需要在"拥有"中的一个所需的ManyToOne关系。侧。所以你需要做的是,将以下代码添加到你的项目实体

/**
* @ORM\ManyToOne(targetEntity="Entity\Character", inversedBy="item")
*/
protected $character;

inversedBy属性创建双向关系。如果没有此声明,您将无法从Character实体加载getItems。

如果您更改了代码,则必须更新数据库并恢复元素。在此之后,一切都会正常。

相关问题