Доктрина 2, как получить данные с обратной стороны (много к одному) - PullRequest
0 голосов
/ 19 августа 2011

У меня есть две сущности, запись и комментарии.

комментарии:

/**
 * @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;
}

но как я могу получить информацию о записи со стороны комментариев.например, я хотел бы получить идентификатор записи из конкретного комментария

1 Ответ

0 голосов
/ 19 августа 2011

Каждый раз, когда вы создаете отношение @OneToMany, вы создаете Collection прокси-объектов в классе на стороне "One" отношения и один прокси-объект в классе на стороне "Many" отношения. Прокси-классы автоматически генерируются Doctrine2 из вашей картографической информации.

Чтобы разрешить Doctrine2 заполнять прокси-объект реальными данными из БД, важно объявить его protected или private. Я не уверен в этом, но похоже, что 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 объектом.

См. главу "Работа с объектами" в документации Doctrine и "Можете ли вы объяснить мне, что такое прокси в Doctrine 2?"

...