我有两个实体 - 商店和产品。一家商店可以有很多产品,但一个产品总是只有一个商店。
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;