我有两种实体类型:\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);
它让我回答:
我的问题是,为什么来自category
变量的$oObject
属性具有NULL
值,尽管数据库中存在id = 1的类别?
更新
在上面的代码之后,我想分别加载这个类别(ID = 1)。一样。但是......当我加载带有其他ID的类别(例如,2)时,它的加载没有任何问题:
$oObject2 = $entity_manager->('\Model\News\Category', '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()
提供的类别对象已填充了适当的数据。