学说2,如何从反面获取数据(多对一)

时间:2011-08-19 08:03:17

标签: doctrine doctrine-orm

我有两个实体,条目和评论。

注释:

/**
 * @Entity(repositoryClass="\Entities\Blog\CommentRepository")
 * @Table(name="blog_comment")
 * @HasLifecycleCallbacks
 */
class Comment extends \Entities\AbstractEntity
{
    /**
     * @Id @Column(name="id", type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ManyToOne(targetEntity="Entry", inversedBy="comments")
     * @JoinColumn(name="entry_id", referencedColumnName="id")
     */
    protected $entry;

    /** @Column(name="approved", type="string", length=255) */
    protected $approved;

    /** @Column(name="title", type="string", length=255) */
    protected $title;

    /** @Column(name="content", type="text") */
    protected $content;

    /** @Column(name="pub_date", type="datetime") */
    protected $pub_date;

    /** @Column(type="datetime") */
    private $created_at;

    /** @Column(type="datetime") */
    private $updated_at;

    /** @PreUpdate */
    public function updated()
    {
        $this->updated_at = new \DateTime("now");
    }

    public function __construct()
    {
        $this->created_at = $this->updated_at = new \DateTime("now");
    }
}

class CommentRepository extends \Entities\PaginatedRepository
{
    protected $_entityClassName = 'Entities\Blog\Comment';
}

和条目:

<?php
namespace Entities\Blog;

/**
 * @Entity(repositoryClass="\Entities\Blog\EntryRepository")
 * @Table(name="blog_entry")
 * @HasLifecycleCallbacks
 */
class Entry extends \Entities\AbstractEntity
{
    /**
     * @Id @Column(name="id", type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /** @Column(name="permalink", type="string", length=255) */
    protected $permalink;

    /** @Column(name="title", type="string", length=255) */
    protected $title;

    /** @Column(name="pub_date", type="datetime") */
    protected $pub_date;

    /** @Column(name="content", type="text") */
    protected $content;

    /** @OneToMany(targetEntity="Comment", mappedBy="entry") */
    protected $comments;

    /** @Column(type="datetime") */
    private $created_at;

    /** @Column(type="datetime") */
    private $updated_at;

    /** @PreUpdate */
    public function updated()
    {
        $this->updated_at = new \DateTime("now");
    }

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

我可以通过以下方式获取属于每个条目的所有评论的集合:

foreach ($comments as $comment){
   $comment-$commentId;
}

但是如何从评论方面获取条目信息。例如,我想从特定评论中获取条目ID

1 个答案:

答案 0 :(得分:0)

每次创建@OneToMany关系时,都会在“One” - 关系的类中创建Collection个代理对象,并在“很多”的类中创建单个代理对象关系。代理类由Doctrine2根据您的映射信息自动生成。

要允许Doctrine2使用来自数据库的实际数据填充代理对象,请务必将其声明为protectedprivate。我不确定这一点,但似乎Doctrine会跟踪实体类中代理对象的任何请求,并确保在首次使用之前填充代理。

要访问关联对象,您必须在Comment类中定义访问者函数:

class Comment extends \Entities\AbstractEntity{
    /** other definitions */

    function getEntity(){
        return $this->entity;
    }
}

并像

一样使用它
$comment = $em->find("Entities\Comment",1);
$entity = $comment->getEntity();

Doctrine2会自动使用实际的$comment->entity对象填充Entity代理。

有关代理的详细信息,请参阅"Workin with Objects" chapter of Doctrine documentation"Can you explain me what is a Proxy in Doctrine 2?"