保存相关的Object Symfony 2

时间:2014-12-16 19:32:37

标签: php symfony

我有用户和帖子。一对多

// 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是空的

2 个答案:

答案 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对象定义,并将其更改(或根据需要创建新行)保存到数据库(如果您有级联删除并从此用户的帖子集合中删除帖子,则删除)。