我一直在我的网络服务器上玩Symfony,我一直在为我的数据库创建带有教义的实体。我想为这些实体中的一个添加一个列......我想做类似的事情:
php app/console doctrine:modify:entity
现在我知道这个命令不存在,但有一种方法(不进行整个迁移)只需添加一列。
P.S。我知道我可以打开php文件并在那里以文本方式添加列然后更新架构,但我将它分发给一些客户端,我喜欢更像“命令行”的方法。
答案 0 :(得分:69)
实际上,使用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
运行console命令(它将在类中添加正确的set / get)
php app/console doctrine:generate:entities AcmeMyBundle:Customer
运行控制台命令
php app/console doctrine:migrations:diff
运行console命令(它会在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
运行console命令(它将在类中添加正确的set / get)
php bin/console doctrine:generate:entities AcmeMyBundle:Customer
运行控制台命令(更新数据库)
php bin/console doctrine:schema:update --force
答案 1 :(得分:9)
您肯定要打开定义实体的PHP / XML / YML文件并在其中添加列。然后,使用命令行并说出
console doctrine:schema:update
这样,您的实体定义与数据库同步,您的数据库也会更新。
答案 2 :(得分:4)
使用学说迁移时,上述步骤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
之后,迁移:diff重读所有实体(而不是从缓存中取出过时的元数据)并创建正确的迁移。
因此,修改实体的完整步骤是:
php app/console redis:flushdb
)php app\console doctrine:migrations:diff
)php app\console doctrine:migrations:migrate
)当然,你的学说元数据缓存可能不是Redis,而是其他东西,比如app / cache中的文件或其他任何东西。别忘了考虑缓存清理。
可能对某人有帮助。
答案 3 :(得分:3)
在Symfony上的现有实体中添加新列 。我也有同样的问题。经过长时间的研究,最好的解决方案就在那里了。
Symfony 4解决方案工作
示例:
在一个名称列中已经创建的博客实体在那里,我想添加描述列。如此简单,输入
php bin/console make:entity Blog
运行此命令后,您要添加新列
答案 4 :(得分:1)
我找到了一种在YourBundle / Resources / Config / doctrine / Yourentity.orm.yml中添加新列的方法。
然后在Entity类中添加了getter和setter方法。
然后从控制台做php app/console doctrine:schema:update --force
。它对我有用。
答案 5 :(得分:1)
在这里,您必须按照两个步骤在您的实体中进行更改 第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
现在,检查数据库中的表格,它已完成!!
答案 6 :(得分:0)
我认为,您需要手动更新关系表以映射关系。 我发现了这个:discussion
同样,我们可以从现有数据库中生成实体,但作为一个整体,但是分开? :(
答案 7 :(得分:0)
这对我有用:
src-->AppBundle-->Entity-->YourClassName.php
src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
php bin/console doctrine:schema:update --force
答案 8 :(得分:0)
如果您需要将新字段属性添加到可以使用make:entity
的实体中,$ php bin /控制台make:entity
要创建或更新的实体的类名
“存在性”
新属性名称(按停止添加字段):
说明
字段类型(输入?以查看所有类型)[string]:
文本
该字段在数据库中是否可以为null(可空)(是/否)[no]:
否
新属性名称(按停止添加字段):
(再次按Enter键完成)
从https://symfony.com/doc/current/doctrine.html提取的信息