一对多关系映射

时间:2015-01-31 22:38:28

标签: php symfony doctrine-orm

我有两个实体 - 商店和产品。一个商店可以有很多产品,但一个产品总是只有一个商店。

class Shop {
/**
     * @var integer
     *
     * @ORM\Column(name="shop_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $shopId;
/**
     * @var \Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Product", mappedBy="shop")
     */
    private $products;

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }
}

class Product {
/**
     * @var integer
     *
     * @ORM\Column(name="product_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $productId;

    /**
     * @ORM\ManyToOne(targetEntity="Shop", inversedBy="products")
     * @ORM\JoinColumn(name="shop_id", referencedColumnName="product_id")
     */
    private $shop;
}

当我运行网站时,我收到通知错误,即product_id是vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1778中未定义的索引。怎么了?

2 个答案:

答案 0 :(得分:1)

您可能需要在Product实体中引用shopId字段。另请注意,您应该使用实体属性'名称,而不是数据库表中列的名称。

/**
 * @ORM\ManyToOne(targetEntity="Shop", inversedBy="products")
 * @ORM\JoinColumn(name="shop_id", referencedColumnName="shopId")
 */
private $shop;

P.S。对于映射问题,Symfony命令doctrine:schema:validate可能很有用。

答案 1 :(得分:0)

商店表中没有product_id列。我认为你的shop_id列名也可能导致与referenceColumnName值冲突。因此,将商店ID列名称更改为Id。

然后将referenceColumnName更改为just(商店)id。

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $shopId;

/**
 * @ORM\ManyToOne(targetEntity="Shop", inversedBy="products")
 * @ORM\JoinColumn(name="shop_id", referencedColumnName="id")
 */
private $shop;