Symfony2原则多对一关系


symfony2 doctrine manytoone relationship

我相信一定有一个简单的解决方案来解决我的问题,但我不能让它工作,我不知道为什么。

场景:我有2个实体:自行车和审查,关系是OneToMany:

/**
 * Bike
 *
 * @ORM'Entity(repositoryClass="BikeRepository")
 * @ORM'HasLifecycleCallbacks
 * @ORM'Table(name="bike")
 */
class Bike
{
...
    /**
     * @var string
     *
     * @ORM'OneToMany(targetEntity="Review", mappedBy="bike", cascade={"persist"}, fetch="EXTRA_LAZY")
     */
    private $reviews;
...
}
/**
 * Review
 *
 * @ORM'Entity(repositoryClass="ReviewRepository")
 * @ORM'Table(name="review")
 * @ORM'HasLifecycleCallbacks()
 */
class Review
{
    ...
    /**
     * @var integer
     *
     * @ORM'ManyToOne(targetEntity="Bike", inversedBy="reviews", fetch="EXTRA_LAZY")
     * @ORM'JoinColumn(name="bike_id", referencedColumnName="id")
     */
    private $bike;
    ....
}  

getter和setter已经由doctrine生成。

在前端,我有一个表单,其中自行车是作为一个隐藏的字段,因为有一个ajax请求的自动完成字段。在控制器中,如果$form->isValid()我从隐藏字段中获取自行车id,在数据库中搜索自行车并设置自行车如下:

if ($form->isValid()) {
    if ($bikeId) {
        $bike = $this->em->getRepository('BikeBundle:Bike')->findOneBy(array('id' => $bikeId));
        $review->setBike($bike);
    }
    $this->em->persist($review);
    $this->em->flush();
}  

对于bike_id,这总是在数据库中给我NULL。你知道哪里出错了吗?我试过在坚持之前转储$评论,我可以得到自行车的细节,所以我不知道出了什么问题。在实体setBike()方法中,我可以获得该Bike对象的任何值,除了getId()返回NULL。

谢谢你的帮助

  1. 你不需要保存一个已经存在的实体,所以你只需要像

    那样保存你的实体

    评审-> setBike(自行车);$ this -> em>冲洗();

  2. 尝试检查学说是否真的返回任何实体。我担心如果它不返回Bike实体

UPD:也尝试检查Bike Entity类的命名空间。这似乎是错误的,在你的情况下,因为通常它看起来像"AcmeBikeBundle:Bike"