Доктрина 2.1 - вставка сущности - PullRequest
3 голосов
/ 02 января 2012

У меня есть вопрос о вставке объекта в базу данных. У меня есть две модели:

class News {
    /**
     * @Column(type="string", length=100)
     * @var string
     */
    protected $title;

    /**
     * @ManyToOne(targetEntity="User", inversedBy="news")
     * @JoinColumn(referencedColumnName="id")
     */ 
    protected $author;

}

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

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

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

}

Чтобы добавить новые новости, я должен включить классы User и News (если они в отдельных файлах, например, UserModel.php и NewsModel.php) и написать код:

$news = new News()
$news->setTitle('TEST title');
$news->setAuthor($database->find('User', 1));
$database->persist($news);

Мой вопрос: есть ли способ вставить новости, не включая User класс?

Ответы [ 2 ]

7 голосов
/ 02 января 2012

Вам не нужно загружать пользователя.

Вместо этого вы можете использовать ссылочный прокси :

<?PHP
$news = new News()
$news->setTitle('TEST title');
$news->setAuthor($em->getReference('User',1));
$em->persist($news);
1 голос
/ 07 февраля 2012

еще одна вещь, которую вы могли бы сделать (думая более объектно-ориентированным способом), это добавить метод с именем addNews($news) в вашу пользовательскую сущность:

public function addNews($news) {
    // you should check if the news doesn't already exist here first
    $this->news->add($news);
    $news->setAuthor($this);
}

и добавить каскадное сохранение в ваше отображение:

/**
 * @OneToMany(targetEntity="News", mappedBy="author", cascade={"persist"})
 */
protected $news;

, затем выберите своего пользователя, добавьте новости и объедините изменения:

$news = new News()
$news->setTitle('TEST title');    
$author = $database->find('User', 1);

$author->addNews($news);

//merge changes on author entity directly
$em->merge($author);

Я предпочитаю этот подход, потому что он дает вам возможность делать дополнительные проверки или контроли при добавленииновости, делающие для многоразового и легко читаемого кода

...