2011-08-25 262 views
2

这些天我很忙于学说。但我对关联感到困惑。虽然我指定一个实体,但不幸的是我不能在两个表之间进行关联。 one2many,many2one或其他。与学说2.1的关联

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

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

我们走吧!

我有两个表。其中之一是用户和另一个是评论。我知道这很简单,但一切都是为了我的恩惠。

用户表有三列是IDCOMMENT_ID

评论表有IDCOMMENT_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 用户表。我想我在某个地方有一个很大的错误。

帮助我错了!

问候....

回答

2

你对你的comment实体滥用@ManyToOne。您正试图将其与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// 
} 

看一看的Associations Mapping章Doctrine 2.0参考,它包含常见关联用例的示例。

+0

@JOHN; 10倍很多。这是非常有帮助的。 – kakashi