Ассоциации с Доктриной 2.1 - PullRequest
2 голосов
/ 25 августа 2011

В эти дни я занята Доктриной.но я запутался в ассоциациях.в то время как я определяю сущность, к сожалению, я не могу сделать связи между ними в двух таблицах.one2many, many2one или что-либо еще.

Я прочитал документ о сопоставлении ассоциаций на веб-сайте .и я так растерялся.

Я хочу сделать простой пример.Пожалуйста, помогите мне!

здесь мы идем!

У меня есть две таблицы.Один из них - пользователи , а другой - комментарии .Я знаю, что это очень просто, но все для моей выгоды.

users Таблица содержит три столбца: ID , name , comment_id .

комментарии таблица содержит id и comment_text столбцы.(я думаю, проблема здесь)

и теперь, когда мои users.php file

/** @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 file

/** @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 Ответ

2 голосов
/ 26 августа 2011

Вы неправильно используете @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 s, ваша структура БД должна быть следующей (псевдокод):

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, она содержит примеры общих случаев использования ассоциаций.

...