gpt4 book ai didi

php - Doctrine 可以定义 MySQL 的 Generated 列吗?

转载 作者:可可西里 更新时间:2023-11-01 07:34:18 25 4
gpt4 key购买 nike

使用 mySQL's generated column 是否正确(如果正确的话如何)在 Symfony 实体中?

例如,下面例子中的GENERATED ALWAYS:

CREATE TABLE contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
fullname varchar(101) GENERATED ALWAYS AS (concat(first_name,' ',last_name)),
email VARCHAR(100) NOT NULL
);

我知道这可以在实体 __construct() 中完成,但是让 Doctrine/mySQL 处理它会更正确吗?像这样的东西:

/**
* @ORM\Column(type="text")
* @ORM\Generated(concat(first_name,' ',last_name))
*/
private $fullname;

最佳答案

首先,对于这个回答来得太晚,我深表歉意,但我能够通过 DQL 为基本的 SELECT 和 JOIN 查询创建一个解决方法。由于修改了生成的实体,我没有使用 UPDATE 查询对此进行测试。

正如上面的用户 dbu 所指出的,您需要首先遵循本指南: https://www.liip.ch/en/blog/doctrine-and-generated-columns

这可以防止 doctrine 在运行架构构建器时尝试修改生成的列。这没有原则在实体更新发生时忽略该列。

您需要确保创建一个添加生成列的迁移。我是这样实现的:

/**
* Adds a generated column for fullname to the contacts table
*
* @param Schema $schema
*/
public function up(Schema $schema)
{
$this->addSql('
ALTER TABLE
contacts
ADD COLUMN
fullname varchar(101) GENERATED ALWAYS AS (concat(first_name,' ',last_name));
');
}

有了上述基础工作,您应该能够让原则使用模式构建器正常生成您的数据库模式,并且在通过迁移添加时不会干扰您生成的列。

现在的下一个问题是确保您的数据可以与您的联系人实体结合,而不会在 UPDATE 和 INSERT 查询期间尝试修改数据库上的结果。

诀窍是创建另一个实体来扩展您当前的联系人实体,并且仅用于 SELECT 和 JOIN 查询。

<?php

namespace Embark\ApiBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Generated values from the contacts table
*
* @ORM\Table(name="contacts")
* @ORM\MappedSuperclass
*/
class ContactGenerated extends Contact
{
/**
*
* @ORM\Column(name="fullname", type="string", nullable=true)
*/
private $fullname;
}

@MappedSuperClass 注释可防止学说模式构建器尝试创建具有相同名称的表。

然后您可以使用 DQL 获取数据:

    $queryBuilder->select('contact')
->from(ContactGenerated::class, 'contact');

这将返回一组 ContactGenerated 实体。如果你试图坚持它们,你会遇到问题,你真的应该把它们当作只读的。

我将留给您解决如何将它们转换为标准 Contact 类的问题,这些类会删除不存在的“全名”属性,这将允许您从选择中执行 UPDATE 查询。

我真的希望这对您有所帮助,就像它对我的用例一样 - 如有任何问题,请随时提问 :)

关于php - Doctrine 可以定义 MySQL 的 Generated 列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39449514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com