Symfony 如何覆盖id';在一个教义继承的等级制度中的注释

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

我使用的是SymfonyMySQL,我试图在我的所有表中遵循一些惯例,其中之一是将每个id的colmun名称保持为
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)')$this->addSql('CREATE TABLE tire (id_tire INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id_tire))');