Symfony 如何覆盖id';在一个教义继承的等级制度中的注释
我使用的是Symfony和MySQL,我试图在我的所有表中遵循一些惯例,其中之一是将每个id的colmun名称保持为Symfony 如何覆盖id';在一个教义继承的等级制度中的注释,symfony,doctrine-orm,Symfony,Doctrine Orm,我使用的是Symfony和MySQL,我试图在我的所有表中遵循一些惯例,其中之一是将每个id的colmun名称保持为id\u tablename格式(请参阅)。因此,我在类中保留了Symfony生成的id名称,但我想用id\u product,id\u tire等替换数据库中的每个字段 为此,我使用了列注释,例如: abstract class Product { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Colu
id\u tablename
格式(请参阅)。因此,我在类中保留了Symfony生成的id
名称,但我想用id\u product
,id\u tire
等替换数据库中的每个字段
为此,我使用了列注释,例如:
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时,我遇到了一个错误类“App\Entity\Tire”上属性“id”的列类型无法更改。
我错过什么了吗
编辑:我试图用以下代码覆盖另一个属性($name
):
/**
*@ORM\Entity(repositoryClass=RimRepository::class)
*@ORM\AttributeOverrides(
*@ORM\AttributeOverride(
*name=“name”,
*column=@ORM\column(name=“name\u-rim”)
* )
* )
*/
类Rim扩展产品
{
/**
*@ORM\Column(type=“string”,长度=255)
*/
私人$name;
// ...
}
但即使使用$id
属性执行相同的操作,我仍然会收到相同的错误消息
当类之间存在关系时,似乎很难处理重命名的字段。所以现在我保留数据库中每个表的默认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;
// ...
}
因此,迁移SQL将类似于以下内容
$this->addSql('CREATE TABLE tire (id_tire INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id_tire))');
这似乎是一个教义如何运作的问题。由于我的系统需要很多实体之间的关系,我没有注意到它,但是如果没有关系,只要它们被正确映射,evrything就可以正常工作。例如:
- 父类
/**
*@ORM\Entity(repositoryClass=ProductRepository::class)
*/
类产品
{
/**
*@ORM\Id
*@ORM\GeneratedValue
*@ORM\Column(type=“integer”,name=“id\u product”)
*/
私人$id;
// ...
}
- 儿童班
/**
*@ORM\Entity(repositoryClass=RimRepository::class)
*@ORM\AttributeOverrides(
*@ORM\AttributeOverride(
*name=“id”,
*column=@ORM\column(type=“integer”,name=“id\u rim”)
* )
* )
*/
类Rim扩展产品
{
/**
*@ORM\Column(type=“integer”)
*/
私人$id;
// ...
}
/**
*@ORM\Entity(repositoryClass=tirrepository::class)
*@ORM\AttributeOverrides(
*@ORM\AttributeOverride(
*name=“id”,
*column=@ORM\column(type=“integer”,name=“id\u”)
* )
* )
*/
轮胎延伸类产品
{
/**
*@ORM\Column(type=“integer”)
*/
私人$id;
// ...
}
将在数据库中生成这些。但对于任何等级的等级关系,比如,该学说都无法检索带有注释的重命名列。Si在我的例子中,我必须在所有表中保留默认的id
名称,以便让Doctrine在建立表之间的关系时找到他所期望的内容
我试图从子类中删除所有关系,并保留父类中的关系,但情况恰恰相反,我仍然在搜索列id
,同时查找关系/约束:
$this->addSql('ALTER TABLE picture ADD CONSTRAINT FK_16DB4F894584665A外键(product_id)引用product(id)');
由于数据库结构复杂,现在似乎不可能做到这一点。它在抱怨类型。只是一个猜测,但可能添加type=“integer”只是为了看看会发生什么。可能只是收到了不同的错误消息,但可能没有。我尝试了type=“integer”
,但仍然有相同的错误。此外,ItriedI喜欢在我的原则映射中强加一点统一性。注释很难处理。阅读你关于属性覆盖的链接让我头晕目眩。我想你可以试试看。在任何情况下,我使用。使这类事情变得容易。但我还没有遇到其他人也使用它。我不知道你可以用这种方式进行映射,因为我发现大多数文档/示例都在注释中使用映射,我会尝试一下。我上一次的响应被截断了,我说我试图覆盖继承的另一个属性,而且它工作得很好。但不是在重写id时。(我添加了在上述问题中起作用的示例)我也尝试过,但在外键方面出现了这个错误:shell执行'ALTER TABLE picture add CONSTRAINT FK_16DB4F894584665A外键(product_id)引用product(id)':SQLSTATE[HY000]时发生异常:常规错误:3734未能添加外键约束。引用表“product”中的约束“FK_16DB4F894584665A”缺少列“id”
,这是因为我与childs实体中的其他表有关系,我认为这些实体不包括名为id
的列。但我刚才重试了一下,若我删除了那个些关系,比如你们的数据库/实体结构比你们在原始问题中指定的更复杂,那个么它就可以工作了。您可以尝试简化新问题并创建新的描述良好的问题。在当前输入方面无法帮助您。我用我所做的回答了下面的问题,并且在使用外键时,看起来条令仍然在寻找id
列。它正在生成这个请求$this->addSql('ALTER TABLE picture ADD CONSTRAINT FK_16DB4F894584665A外键(product_id)引用product(id)')你能提供图片课程吗?没有它,社区就不可能找到根本原因。此外,创建新的q是一种很好的做法
$this->addSql('CREATE TABLE tire (id_tire INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id_tire))');