【问题标题】:retrieve attribute from object in entity doctrine从实体学说中的对象检索属性
【发布时间】:2015-10-23 13:07:34
【问题描述】:

所以我有这个功能:

MyProject\Bundle\Entity\Audio;

/**
 * 
 * @return string
 */ 
public function getStudioName()
{
   return $this->getStudio()->getNom();
}

它应该从对象 Studio 中检索属性 nom

它们是这样定义的:

/**
 * @var \MyProject\Bundle\Entity\Device
 */

private $studio;

...

/**
 * Get studio
 *
 * @return \MyProject\Bundle\Entity\Device
 */
public function getStudio()
{
    return $this->studio;
}

->getNom 也只是一个基本的回报,效果很好。

所以我收到以下错误消息:

错误:在非对象上调用成员函数 getNom()

我读过关于延迟加载的文章,我明白为什么$this->getStudio() 给了我一个代理而不是一个实际的设备对象,但在那之后我不能再进一步使用getNom()... 我尝试添加fetch : EAGER 以避免延迟加载,但它仍然不起作用。

有什么想法吗?

【问题讨论】:

  • 你能传递整个实体的代码吗?看起来属性$studio 可以为NULL。在这种情况下,您需要验证它是否已设置。如果不是,则返回 NULL。
  • 哇,它成功了。非常感谢 ! (只花了 2 个小时...)这里是代码: /** * * @return string */ public function getStudioName() { $data = $this->getStudio(); if(!is_null($data)) { return $data->getNom(); } 返回空值; }
  • 太好了,很高兴它帮助了你:)。我已经发布了完整的答案,所以可以关闭。

标签: symfony doctrine entity lazy-loading


【解决方案1】:

看起来属性$studio 可以为NULL。在这种情况下,您需要验证它是否已设置。如果不是,则返回 NULL。

真正的代码应该是这样的:

<?php 

public function getStudioName(): ?string
{
    return $this->studio ? $this->studio->getName() : null;
}

【讨论】:

  • public function getStudioName() { return (!$this-&gt;studio) ?: $this-&gt;studio-&gt;getName(); }
  • 我认为这是测试 $this->studio 是否是实现 getName() 方法的类的实例的更好方法。 if ($this-&gt;studio instanceof MyProject\Bundle\Entity\Audio)
  • $studio 只能是NULLAudio。应该在其他地方检查该值,例如构造函数或设置器,通过 typehint。
  • @scoolnico 感谢您的提示,我已经使用内联条件更新了代码。
猜你喜欢
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2018-07-18
相关资源
最近更新 更多