php - 学说 : Explicitly giving primary key value while not changing the auto increment

标签 php mysql symfony doctrine-orm

有一个包含许多列的表以及具有自动递增属性的主键列“id”。 数据库是mySQL。

该列中插入了两种 PHP 代码。 1.) 普通插入查询创建为字符串,并通过与数据库建立 ADO 连接来执行。在这种情况下,未提供主键值,因此它使用表的自动增量值。

2.) 有一个 php symfony doctrine 的实体类,其主字段声明为

/**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     */
    private $id;

插入使用实体管理器的持久化方法。 此处在插入时,显式提供了 id 值,该值远大于列的自动递增值。这就是注释中省略了 Generation_Type 的原因。

现在,假设当前的 auto_increment 值为 10000。 我希望在执行第一个场景时,下一个 id 被视为预期的 1001。 但是如果使用显式 id = 2000 执行第二个场景,它会插入带有 2000 的记录但不会将 auto_increment 更改为 2000。它应该仍然保持为 1001。

我必须围绕这段代码进行更改吗?

$this->em->persist(obj);

提前致谢。

最佳答案

如果你不需要你的 Doctrine 实体使用 AUTO 策略来设置 Id 值,你应该可以简单地使用 NONE 策略

/**
 * @ORM\Column(type="integer")
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="NONE")
 */
private $id;

可在此处找到有关可用策略的更多信息:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html#identifier-generation-strategies

如果您需要您的实体在正常工作流程中具有自动增量策略,您可以将其设置为 AUTO 并在需要的时候通过以下方式禁用它:

$metadata = $entityManager->getClassMetadata(get_class($entity));
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$em->persist($entity);
$em->flush();

一般免责声明:谨慎行事!

关于php - 学说 : Explicitly giving primary key value while not changing the auto increment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55410923/

相关文章:

php - 重复的动态链接

PHP 不从网页执行 [但在 Raspberry Pi 上可以从 PHP-CLI 执行]

php - Codeigniter Group 通过仅返回第一行

MySQL:如何允许远程连接到 mysql

php - Sonata-admin 无法修改具有继承的类

php - 通过 Composer 更新 symfony 3.2.4 错误

php - CakePhp:Cake Email AfterSend 事件

php - MySQL 从 IPBoard 帐户授权用户

android - 如何从android中的sqlite数据库更新数据库中的行

php - Symfony2 Twig 迭代器