Php Symfony条令两个键用于不同目的,一个自动增量

Php Symfony条令两个键用于不同目的,一个自动增量,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我是Symfony和Doctrine的新手,使用最新版本,尝试创建一个具有两个关键字段(属性)的模型,用于不同的目的$id不是主键,但在MySQL/MariaDB中是自动递增的$key是映射到CHAR[100]的string length=100,是主键和@ORM\Id。尽管这是我试图做的,但我认为这不是一个受支持的配置。我希望能够使用key合并(),但也希望有AI列作为参考(加入),因为我认为它会有更好的性能,即使我不想要:)问题是我用来填充的数据源可能会发送多个具有相同键的对象,在这种情况下

我是Symfony和Doctrine的新手,使用最新版本,尝试创建一个具有两个关键字段(属性)的模型,用于不同的目的$id不是主键,但在MySQL/MariaDB中是自动递增的$key是映射到CHAR[100]的string length=100,是主键和@ORM\Id。尽管这是我试图做的,但我认为这不是一个受支持的配置。我希望能够使用
key
合并(),但也希望有AI列作为参考(加入),因为我认为它会有更好的性能,即使我不想要:)问题是我用来填充的数据源可能会发送多个具有相同
键的对象,在这种情况下,我希望它们保留到同一记录,最后一个对象是最后一个更新数据库的对象,没有重复的

我在某个地方读到,要使用AI的DB实现和非主键,我可能需要编写一个自定义的编译器。我几乎不知道要创建什么文件,把它们放在哪里,我必须做什么映射,或者怎样做。希望有人能帮忙

<?php
// src/Entity/View.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ViewRepository")
 */
class View
{
    /**
     * @ORM\Column(type="integer", name="created_by")
     */
    private $created_by;

    /**
     * @ORM\Column(type="integer", name="updated_by")
     */
    private $updated_by;

    /**
     * @ORM\Column(type="bigint", name="id")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=100, name="`key`")
     */
    private $key;

    /**
     * @ORM\Column(type="json", name="`value`")
     */
    private $value;


    public function getCreatedBy()
    {
        return $this->created_by;
    }

    public function setCreatedBy($value)
    {
        $this->created_by = $value;
    }

    public function getUpdatedBy()
    {
        return $this->updated_by;
    }

    public function setUpdatedBy($value)
    {
        $this->updated_by = $value;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setId($value)
    {
        $this->id = $value;
    }

    public function getKey()
    {
        return $this->key;
    }

    public function setKey($value)
    {
        $this->key = $value;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function setValue($value)
    {
        $this->value = $value;
    }
}


/* View */
CREATE TABLE IF NOT EXISTS `View` (
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    created_by INT UNSIGNED NOT NULL,
    updated_by INT UNSIGNED NOT NULL,
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `key` CHAR(100) NOT NULL,
    `value` JSON NOT NULL,
    PRIMARY KEY PK_VIEW (`key`),
    UNIQUE KEY UQ_VIEW (id)
) CHARSET = latin1;

$entity = new View();
$entity->setCreatedBy(0);
$entity->setUpdatedBy(0);
$entity->setKey($messageId);
$entity->setValue($json);

$entityManager = $this->getDoctrine()->getManager();
$entityManager->merge($entity);
$entityManager->flush();

所以你的“key”是你的主键,但是当你调用一个查询时,你可以有几个记录具有相同的“key”,为什么会这样呢?你能再解释一下吗?@莫克斯基不,我不是这个意思。我有一个外部对象流,其中可能包含或不包含重复的对象,我正在尝试将它们持久化到DB。如果是重复的,我想取最后一个并保存到DB。副本可以与具有唯一密钥的其他不同对象交错。要澄清的是,
id
key
在数据库中都是唯一的。因此,您的Web服务或api或其他应用程序中有大量数据,您想编辑数据库中的记录,并根据“键”从api接收最后一条记录,不是吗?@MoxGeek Yes,但是我还想维护一个
id
列,该列是AI和唯一的。您可以根据不在id上的键进行编辑查询,然后用所有传入的数据编辑您的记录,但是如果这些数据太大,您可以将其排入redis或其他什么程序。如果您确实根据密钥编辑了记录并保持id不变,那么会出现什么问题?因此,您的“密钥”是您的主键,但是当您调用查询时,您可以拥有多个具有相同“密钥”的记录,为什么会这样?你能再解释一下吗?@莫克斯基不,我不是这个意思。我有一个外部对象流,其中可能包含或不包含重复的对象,我正在尝试将它们持久化到DB。如果是重复的,我想取最后一个并保存到DB。副本可以与具有唯一密钥的其他不同对象交错。要澄清的是,
id
key
在数据库中都是唯一的。因此,您的Web服务或api或其他应用程序中有大量数据,您想编辑数据库中的记录,并根据“键”从api接收最后一条记录,不是吗?@MoxGeek Yes,但是我还想维护一个
id
列,该列是AI和唯一的。您可以根据不在id上的键进行编辑查询,然后用所有传入的数据编辑您的记录,但是如果这些数据太大,您可以将其排入redis或其他什么程序。如果您确实根据密钥编辑了记录,并保持id不变,会出现什么问题?