【问题标题】:Doctrine - Entity loaded without existing associationsDoctrine - 在没有现有关联的情况下加载的实体
【发布时间】:2014-12-20 17:19:19
【问题描述】:

我有两种实体类型:\Model\News\Model\News\Category

\Model\News:(没有几个字段)

namespace Model;

/**
 * @Entity
 * @Table(name="news")
 */
class News extends \Framework\Model {

    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer")
     */
    protected $id;

    /**
     * @ManyToOne(targetEntity="\Model\User", inversedBy="news")
     */
    protected $author;

    /**
     * @ManyToOne(targetEntity="\Model\News\Category", inversedBy="news")
     */
    protected $category;
}

\Model\News\Category:

namespace Model\News;

/**
 * @Entity
 * @Table(name="news_category")
 */
class Category extends \Framework\Model {

    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer")
     */
    protected $id;

    /**
     * @Column(type="string", length=50, unique=TRUE)
     */
    protected $name;

    /**
     * @OneToMany(targetEntity="\Model\News", mappedBy="category")
     */
    protected $news;

    /**
     * Constructor
     */
    public function __construct() {
        parent::__construct();

        $this->news = new \Doctrine\Common\Collections\ArrayCollection;
    }
}

来自\Model\News的表格数据:

 id | category_id |  author_id
-------------------------------     ...
 4  |      1      |     NULL

\Model\News\Category 中的表格数据:

 id |   name 
---------------
 1  | General 
---------------
 2  | Other

当我使用此特定代码加载 News 类型实体并使用 \Kint 类进行转储时:

$sId     = '4';
$sModel  = 'Model\News';
$oObject = $entity_manager->find($sModel, $sId);

d($oObject);

它返回给我这个:

我的问题是,为什么 $oObject 变量中的 category 属性具有 NULL 值,尽管数据库中存在 id = 1 的类别?


更新:

在上面的代码之后,我想单独加载这个类别(ID=1)。一样。但是...当我加载具有其他 ID(例如 2)的类别时,它的加载没有问题:

$oObject2 = $entity_manager->('\Model\News\Category', '2');

我现在不知道该怎么办......

【问题讨论】:

    标签: php doctrine-orm doctrine


    【解决方案1】:

    如果您知道几乎每次加载新闻时都会访问类别实体,您可能希望立即加载它(强制教条在加载新闻时加载它,而不是在调用类别属性时加载)。

    为此,只需在您的关联中添加fetch="EAGER" 注释

    /**
     * @ManyToOne(targetEntity="\Model\News\Category", inversedBy="news", fetch="EAGER")
     */
    protected $category;
    

    【讨论】:

    • 不知道。感谢您的提示;)。
    【解决方案2】:

    所以...感谢@asm89 from #doctrine IRC chat in freenode server,我终于解决了这个问题。

    Doctrine 正在创建一个使用“延迟加载”的代理类。仅当使用其中一个 getter 时才加载数据。

    所以,在使用$oObject->getCategory()->getName() 之后,我从$oObject->getCategory() 获得的类别对象被正确的数据填充了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 2016-05-10
      相关资源
      最近更新 更多