[英]Save related Object Symfony 2
我有用戶和帖子。 一對多
//user.php
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="posts")
*/
private $posts;
public function __construct () {
$this->posts = new ArrayCollection();
}
post.php
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="posts")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $posts;
控制者
$post->setPosts($this->getUser());
$em->persist($post);
$em->flush();
我必須將setPosts用於與持久相關的用戶嗎? 我可以保存級聯或類似的東西嗎?
我知道
在教義中有兩種級聯:
1)ORM級別
2)數據庫級別
但是我不明白何時使用cascade={"persist"})
我的問題是:
cascade={"persist"})
? 更新
我試過了
//用戶
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="posts",cascade={"persist"})
*/
private $posts;
控制者
$user = $this->getUser();
$user->addPost($post);
$em->persist($user);
$em->flush();
但不起作用,數據庫中的字段user_id為空
您的實體應如下所示:
User.php
class User {
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="user", cascade={"persist"})
*/
private $posts;
public function addPost(Post $post) {
$post->setUser($this); // Call Post's setter here
$this->$posts[] = $post; // Add post to the collection
}
}
Post.php
class Post {
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="posts")
*/
private $user;
public function setUser(User $user) {
$this->user = $user; // Set post's author
}
}
在這種情況下,如果要同時創建用戶及其帖子,則可以使用cascade
:要同時保留用戶和帖子,並將帖子附加到用戶。
如果您在保留帖子時已經存在該用戶,則只需設置帖子的作者並保留后者:
Controller.php
public function editPostAction() {
// ...
$post->setUser($this->getUser());
$em->persist($post);
$em->flush();
// ...
}
順便說一下,在一對多關系中,擁有方是多方,在這種情況下為Post。
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="posts", cascade={"persist"})
*/
private $posts;
所以所有的$em->persist($user);
這樣做是告訴實體管理員應該管理$ user。 被管理實體只是意味着,當您調用$em->flush()
,它將通過在所有所需表中創建新行或更新現有表將其當前狀態保存到數據庫中。
因此,要真正回答您的問題。 通過在此注釋中添加cascade = {“ persist”},實體管理器知道如果正在管理此User對象,則在進行刷新調用時,它還需要執行為所有Post對象定義的任何層疊操作與此用戶關聯,並將其更改保存(或根據需要創建新行)到數據庫中(如果您具有級聯刪除,則從該用戶的帖子集合中刪除帖子,然后刪除)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.