我有用户和帖子。一对多
// 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用于持久相关用户吗?我可以用级联或其他东西保存吗?
我知道
Doctrine中有两种级联:
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是空的
答案 0 :(得分:3)
您的实体应如下所示:
<强> 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();
// ...
}
顺便说一句,在一对多关系中,拥有方是多方,在这种情况下发布。
答案 1 :(得分:0)
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="posts", cascade={"persist"})
*/
private $posts;
所以$em->persist($user);
所做的就是告诉实体经理它应该管理$ user。被管理的实体只意味着当您调用$em->flush()
时,它会将当前状态的实体保存到数据库,方法是在所有需要的表中创建一个新行,或者更新现有的。
所以要真正回答你的问题。 通过将cascade = {&#34; persist&#34;}添加到此批注中,实体管理器知道如果正在管理此User对象,则在进行刷新调用时,它还需要执行您拥有的任何级联操作为与此用户关联的所有Post对象定义,并将其更改(或根据需要创建新行)保存到数据库(如果您有级联删除并从此用户的帖子集合中删除帖子,则删除)。