这些天我很忙于学说。但我对协会感到困惑。虽然我指定一个实体,但遗憾的是我无法在两个表中进行关联。 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。我想我在某个地方犯了大错。
帮助我错了!
...方面
答案 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章节,它包含常见关联用例的样本。