与学说2.1的关联

时间:2011-08-25 16:44:54

标签: associations doctrine-orm

这些天我很忙于学说。但我对协会感到困惑。虽然我指定一个实体,但遗憾的是我无法在两个表中进行关联。 one2many,many2one或其他。

我在website中阅读了有关关联映射的文档。我很困惑。

我想做一个简单的例子。请帮帮我!

我们走吧!

我有两张桌子。其中一个是用户,另一个是评论。我知道这很简单,但一切都是为了我的利益。

用户表包含三列 ID 名称 comment_id

评论表格包含 ID comment_text 列。 (我想,问题在这里)

现在我的 users.php 文件

/** @Entity @Table(name="users") */
class User{

/** @Id @GeneratedValue @Column(type="integer") */
private $id;

/** @Column(name="name", length=55, type="string") */
private $name;

/**
 * @OneToMany(targetEntity="Comment", mappedBy="author")
 */
private $commentID;

public function addComment($comment){

    $this->commentID[] = $comment;

}

public function setName($new){
    $this->name = $new;
}

public function getName(){
    return $this->name;
}

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

comments.php 文件

/** @Entity @Table(name="comments") */
class Comment{
   /** @Id @GeneratedValue @Column(name="author", type="integer")
    * @ManyToOne(targetEntity="User", inversedBy="commentID")
   */
private $author;

   /** @Column(name="comment_text", type="text") */
private $commentText;

public function setAuthor($author)
  {
      $author->addComment($this);
      $this->author = $author;
  }

public function setComment($new){
     $this->commentText = $new;
  }

public function getComment(){
      return $this->commentText;
  }
}

就是这样。我想在两个表中插入,选择,更新和删除项目。

$person = new User();
$person->setName('Jack Sparrow');

$comment = new Comment();
$comment->setComment('Hello pirates !');
$comment->setAuthor($person);

$em->persist($person);
$em->persist($comment);
$em->flush();

该代码效果很好,但用户表中 comment_id 列的值始终为零= 0。我想我在某个地方犯了大错。

帮助我错了!

...方面

1 个答案:

答案 0 :(得分:2)

您滥用@ManyToOne实体上的comment。您正尝试将其与comment_id列相关联,但这不是必需的,并且在您的示例中是错误的。它应该类似于以下内容(只是一个示例,正确的代码

/** @Entity @Table(name="comments") */
class Comment{
    /** @Id @GeneratedValue @Column(name="id", type="integer") */
    private $comment_id;

    /**
     * @ManyToOne(targetEntity="User", inversedBy="commentID")
     */
    private $author;
    //other declarations//
}

另外,我怀疑您的数据库是否设计正确。在您当前的架构中,您有User - > Comment关联,因此实际上User位于Many关系的一侧。因此,对于User多个Comment,您的数据库结构应该是以下(伪代码):

users (id, name)
comments(id, comment_text, author_id)

在这种情况下,您的Entitites声明将是

/** @Entity @Table(name="users") */
class User{

    /** @Id @GeneratedValue @Column(type="integer") */
    private $id;

    /** @Column(name="name", length=55, type="string") */
    private $name;

    /**
     * @OneToMany(targetEntity="Comment", mappedBy="author")
     */
    private $comments;

    //Other declarations//
}

/** @Entity @Table(name="comments") */
class Comment{
    /** @Id @GeneratedValue @Column(type="integer") */
    private $id;

    /** @Column(name="comment_text", type="text") */
    private $text;

    /**
     * @ManyToOne(targetEntity="User", inversedBy="comments")
     * @JoinColumn(name="author_id", referencesdColumn="id")
     */
    private $author;

    //Other declarations//
}

查看Doctrine 2.0参考的Associations Mapping章节,它包含常见关联用例的样本。