Doctrine - 在没有现有关联的情况下加载实体

时间:2014-12-20 17:19:19

标签: php doctrine-orm doctrine

我有两种实体类型:\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;
}

\模型\新闻\分类:

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

它让我回答:

Image 1

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


更新

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

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

我不知道现在要做什么......

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

所以...我终于通过@asm89服务器中的#doctrine IRC聊天freenode解决了这个问题。

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

因此,在使用$oObject->getCategory()->getName()后,$oObject->getCategory()提供的类别对象已填充了适当的数据。

相关问题