繁体   English   中英

如何在 Doctrine 继承层次结构中覆盖 id 的注释

[英]How to override the id's annotation in a Doctrine inheritnce hiearchy

我与SymfonyMySQL的工作,我想跟随在所有我的表中的一些约定,其中之一就是让每个ID的colmun名称格式id_tablename (见图表)。 所以我在类中保留了 Symfony 生成的id名称,但我想用id_productid_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM