[英]How to override the id's annotation in a Doctrine inheritnce hiearchy
我与Symfony和MySQL的工作,我想跟随在所有我的表中的一些约定,其中之一就是让每个ID的colmun名称格式id_tablename
(见图表)。 所以我在类中保留了 Symfony 生成的id
名称,但我想用id_product
, id_tire
等替换数据库中的每个字段,...
为此,我正在使用Column注释,例如:
abstract class Product
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer", name="id_product")
*/
private $id;
// ...
}
对于每个子类,我使用AttributeOverride注释,如文档中所述,如下所示
/**
* @ORM\Entity(repositoryClass=TireRepository::class)
* @ORM\AttributeOverrides(
* @ORM\AttributeOverride(
* name = "id",
* column=@ORM\Column(name="id_tire")
* )
* )
*/
class Tire extends Product
{
// ...
}
但是在尝试php bin/console make:migration
我收到错误The column type of attribute 'id' on class 'App\\Entity\\Tire' could not be changed.
我错过了什么 ?
编辑:我尝试使用以下有效代码覆盖另一个属性( $name
):
/**
* @ORM\Entity(repositoryClass=RimRepository::class)
* @ORM\AttributeOverrides(
* @ORM\AttributeOverride(
* name = "name",
* column=@ORM\Column(name="name_rim")
* )
* )
*/
class Rim extends Product
{
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
// ...
}
但即使对$id
属性做同样的事情,我仍然有同样的错误信息。
当您在类之间存在关系时,似乎 Doctrine 也难以处理重命名的字段。 所以现在我保留数据库中每个表的默认id
名称,以继续工作。
请检查下面的正确示例。 看起来你只是在AttributeOverride
缺少type="integer"
use Doctrine\ORM\Mapping as ORM;
/**
* @MappedSuperclass
*/
abstract class Product
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer", name="id_product")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255)
*/
protected $name;
// ...
}
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\AttributeOverrides(
* @ORM\AttributeOverride(
* name = "id",
* column=@ORM\Column(name="id_tire", type="integer")
* )
* )
*/
class Tire extends Product
{
// ...
}
结果迁移 SQL 将类似于以下内容
$this->addSql('CREATE TABLE tire (id_tire INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id_tire))');
这似乎是 Doctrine 工作方式的问题。 由于我的系统需要实体之间的许多关系,我没有注意到它,但是没有关系,如果它们被正确映射,一切都可以正常工作。 例如:
/**
* @ORM\Entity(repositoryClass=ProductRepository::class)
*/
class Product
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer", name="id_product")
*/
private $id;
// ...
}
/**
* @ORM\Entity(repositoryClass=RimRepository::class)
* @ORM\AttributeOverrides(
* @ORM\AttributeOverride(
* name = "id",
* column=@ORM\Column(type="integer", name="id_rim")
* )
* )
*/
class Rim extends Product
{
/**
* @ORM\Column(type="integer")
*/
private $id;
// ...
}
/**
* @ORM\Entity(repositoryClass=TIreRepository::class)
* @ORM\AttributeOverrides(
* @ORM\AttributeOverride(
* name = "id",
* column=@ORM\Column(type="integer", name="id_tire")
* )
* )
*/
class Tire extends Product
{
/**
* @ORM\Column(type="integer")
*/
private $id;
// ...
}
将在数据库中生成这些表。 但是对于像这种情况下的层次结构的任何级别的关系,Doctrine 将无法检索带有注释的重命名列。 Si 在我的情况下,我必须在所有表中保留默认id
名称,以便让 Doctrine 在建立表之间的关系时找到他期望的内容。
我试图从子类中删除所有关系并保留父类中的所有关系,反之亦然,但是 Doctrine 在寻找关系/约束时仍然搜索列id
:
$this->addSql('ALTER TABLE picture ADD CONSTRAINT FK_16DB4F894584665A FOREIGN KEY (product_id) REFERENCES product (id)');
现在似乎不可能做到,因为数据库结构复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.