我一直在我的 Web 服务器上使用 Symfony,并且一直在为我的数据库创建具有原则的实体。我想向其中一个实体添加一列......我想做类似的事情:
php app/console doctrine:modify:entity
现在我知道这个命令不存在,但是有没有办法(不进行整个迁移)来简单地添加一列。
PS 我知道我可以打开 php 文件并在其中以文本方式添加列,然后更新架构,但我将其分发给一些客户端,我更喜欢“命令行式”的方法。
我一直在我的 Web 服务器上使用 Symfony,并且一直在为我的数据库创建具有原则的实体。我想向其中一个实体添加一列......我想做类似的事情:
php app/console doctrine:modify:entity
现在我知道这个命令不存在,但是有没有办法(不进行整个迁移)来简单地添加一列。
PS 我知道我可以打开 php 文件并在其中以文本方式添加列,然后更新架构,但我将其分发给一些客户端,我更喜欢“命令行式”的方法。
实际上,使用 Doctrine 做你建议的事情根本没有意义。
Doctrine 是一个 ORM(对象关系映射)工具。这意味着你想从你的 PHP 代码中抽象出数据库,你将数据库的东西委托给 Doctrine。教义在这方面做得很好。
由于您想让您的客户/同行使用模型的最新版本更新,您应该使用 Doctrine Migrations ( http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html )。这就是管理数据库更新的方式。此外,它使您可以完全控制升级/降级数据库时的操作。例如,您可以在添加 FK 之前设置默认值。
在类上添加新属性的步骤应该是:
对于 Symfony 2:
通过以下方式修改类:
Acme\MyBundle\Entity\Customer 并添加您想要的属性;
Acme\MyBundle\Entity\Customer
或修改学说文件:
Acme/MyBundle/Resources/config/doctrine/customer.yml
运行控制台命令(它将在类中添加正确的 set/get)
php app/console doctrine:generate:entities AcmeMyBundle:Customer
运行控制台命令
php app/console doctrine:migrations:diff
运行控制台命令(它将在 app/DoctrineMigrations 上放置一个新文件)
php app/console doctrine:migrations:migrate
当您部署新版本的代码时,您所要做的就是更新源代码并运行上面的命令。
对于 Symfony 3:
通过以下方式修改类:
Acme\MyBundle\Entity\Customer 并添加您想要的属性;
Acme\MyBundle\Entity\Customer
或修改学说文件:
Acme/MyBundle/Resources/config/doctrine/customer.yml
运行控制台命令(它将在类中添加正确的 set/get)
php bin/console doctrine:generate:entities AcmeMyBundle:Customer
运行控制台命令(更新数据库)
php bin/console doctrine:schema:update --force
在 Symfony 的现有实体中添加新列。我有同样的问题。经过我长时间的研究,最好的解决方案就在那里。
Symfony 4 上的解决方案工作
例子:
已经在一个名称列中创建的博客实体在那里,我想添加描述列。这么简单的输入
php bin/console make:entity Blog
运行此命令后,您要添加新列
您肯定想要打开定义实体的 PHP/XML/YML 文件并在其中添加列。然后,您使用命令行并说
console doctrine:schema:update
这样,您的实体定义与数据库同步并且您的数据库得到更新。
php app/console doctrine:migrations:diff
使用学说迁移时,上述步骤存在一个陷阱。
您对实体进行了更改,一切似乎都有效,但创建迁移的命令显示php app/console doctrine:migrations:diff
“在您的映射信息中未检测到更改”。
而且你找不到旧的数据库结构放在哪里,在文件中搜索一无所获。
对我来说,关键是清除 Redis 缓存。
php app/console redis:flushdb
这是因为 config.yml
snc_redis:
clients:
default:
type: predis
alias: default
dsn: redis://localhost
doctrine:
query_cache:
client: default
entity_manager: default
namespace: "%kernel.root_dir%"
metadata_cache:
client: default
entity_manager: default
document_manager: default
namespace: "%kernel.root_dir%"
result_cache:
client: default
namespace: "%kernel.root_dir%"
entity_manager: [default, read] # you may specify multiple entity_managers
之后, migrations:diff 重新读取所有实体(而不是从缓存中取出过时的元数据)并创建正确的迁移。
因此,修改实体的完整步骤链是:
php app/console redis:flushdb
)php app\console doctrine:migrations:diff
)php app\console doctrine:migrations:migrate
)当然,您的学说元数据缓存可能不是 Redis,而是其他东西,例如 app/cache 中的文件或其他任何东西。不要忘记考虑缓存清除。
可能对某人有帮助。
我找到了一种在 YourBundle/Resources/Config/doctrine/Yourentity.orm.yml 中添加新列的方法。
然后在 Entity 类中添加 getter 和 setter 方法。
然后php app/console doctrine:schema:update --force
从控制台做。它对我有用。
如果您需要向现有实体添加新字段属性,您可以使用 make:entity
$ php bin/控制台 make:entity
要创建或更新的实体的类名
“存在”
新属性名称(按下停止添加字段):
描述
字段类型(输入?查看所有类型)[字符串]:
文本
该字段在数据库中是否可以为空(可为空)(是/否)[否]:
不
新属性名称(按下停止添加字段):
(再次按回车键完成)
在这里,您必须按照两个步骤对您的实体进行更改第 1 步:打开您的实体文件..对于 EX:“Acme\MyBundle\Entity\Book”
当前实体只有几个字段,例如:id、name、title 等。现在,如果您想添加“image”的新字段并更改“title”字段的约束,然后使用 getter 和 setter 添加“image”字段
/**
* @var string
*
* @ORM\Column(name="image", type="string", length=500)
*/
private $image;
并添加 getter 和 setter
/**
* Set image
*
* @param string $image
*
* @return Book
*/
public function setImage($image)
{
$this->image = $image;
return $this;
}
/**
* Get image
*
* @return string
*/
public function getimage()
{
return $this->image;
}
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=500)
*/
private $title;
好的...您已根据需要进行了更改,而您仅一步之遥。
第 2 步:在项目目录中触发此命令
php bin/console doctrine:schema:update --force
现在,检查数据库中的表,完成!
我认为,您需要手动更新关系表以映射关系。我发现了这个:讨论
同样,我们可以从现有数据库中生成实体,作为一个整体,但单独?:(
这就是它对我的工作方式:
src-->AppBundle-->Entity-->YourClassName.php
src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
php bin/console doctrine:schema:update --force