一对多关系映射


One to many relationship mapping

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

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中未定义的索引。怎么了?

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

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

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

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

然后将 referenceColumnName 更改为 (商店) 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;