Php 向Symfony中的现有实体添加列
我一直在我的web服务器上玩Symfony,我一直在为我的数据库创建entity with doctrine。我想在这些实体中添加一列。。。我想做一些事情,比如:Php 向Symfony中的现有实体添加列,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我一直在我的web服务器上玩Symfony,我一直在为我的数据库创建entity with doctrine。我想在这些实体中添加一列。。。我想做一些事情,比如: php app/console doctrine:modify:entity 现在我知道这个命令不存在,但是有没有一种方法(不进行整个迁移)可以简单地添加一个列 另外,我知道我可以打开php文件并以文本方式在其中添加列,然后更新模式,但我正在将其分发给一些客户机,我喜欢更“类似命令行”的方法。我认为,您需要手动更新关系表以映射关系。
php app/console doctrine:modify:entity
现在我知道这个命令不存在,但是有没有一种方法(不进行整个迁移)可以简单地添加一个列
另外,我知道我可以打开php文件并以文本方式在其中添加列,然后更新模式,但我正在将其分发给一些客户机,我喜欢更“类似命令行”的方法。我认为,您需要手动更新关系表以映射关系。 我发现:
同样,我们可以从现有数据库中生成实体,作为一个整体,但单独生成:(事实上,用条令来做你建议的事情毫无意义 Doctrine是一个ORM(对象关系映射)工具。它意味着你想从PHP代码中提取数据库,你可以将数据库的内容委托给Doctrine。Doctrine在这方面做得很好 由于您希望使用最新版本的模型不断更新您的客户/同行,您应该使用Doctrine Migrations()。这是管理数据库更新的方法。此外,它使您能够完全控制升级/降级数据库时的操作。例如,您可以在添加FK之前设置默认值 在类上添加新属性的步骤应为: 对于Symfony 2:
- 通过以下方式修改类:
- Acme\MyBundle\Entity\Customer并添加所需的属性
Acme\MyBundle\Entity\Customer
- 或修改条令文件:
Acme/MyBundle/Resources/config/doctor/customer.yml
- Acme\MyBundle\Entity\Customer并添加所需的属性
- 运行console命令(它将在类中添加适当的set/get)
php应用程序/控制台原则:生成:实体AcmeMyBundle:Customer
- 运行控制台命令
php应用程序/控制台原则:迁移:diff
- 运行console命令(它将在app/doctrin上放置一个新文件)
php应用程序/控制台原则:迁移:迁移
- 通过以下方式修改类:
- Acme\MyBundle\Entity\Customer并添加所需的属性
Acme\MyBundle\Entity\Customer
- 或修改条令文件:
Acme/MyBundle/Resources/config/doctor/customer.yml
- Acme\MyBundle\Entity\Customer并添加所需的属性
- 运行console命令(它将在类中添加适当的set/get)
php bin/console原则:生成:实体AcmeMyBundle:Customer
- 运行控制台命令(更新数据库)
php bin/console原则:模式:更新--force
console doctrine:schema:update
这样,您的实体定义将与数据库同步,数据库也将得到更新。我找到了一种方法,在YourBundle/Resources/Config/doctor/yourtentity.orm.yml中添加了新列 然后在实体类中添加了getter和setter方法
然后做了
php应用程序/控制台原则:schema:update——从控制台强制执行。这对我很有效。在使用原则迁移时,上面描述的步骤php应用程序/控制台原则:迁移:diff
存在一个陷阱
您在实体中进行了更改,所有这些似乎都是有效的,但是关于创建迁移的命令php应用程序/控制台条令: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重新读取所有实体(而不是从缓存中获取过时的元数据),并创建正确的迁移
因此,修改实体的完整步骤链是:
修改实体类(编辑实体文件)
清除元数据的Redis缓存(php应用程序/控制台Redis:flushdb
)
创建(也可以编辑)迁移(php-app\console原则:迁移:diff
)
执行迁移(php-app\console原则:迁移:迁移
)
当然,你的元数据缓存可能不是Redis,而是其他东西,比如app/cache中的文件或其他任何东西。别忘了考虑缓存清除
可能对某人有帮助。对于SYMFONY3用户。。。
在这里,您必须遵循两个步骤对实体进行更改
步骤1:打开实体文件..例如:“Acme\MyBundle\Entity\Book”
当前实体只有几个字段,如:id、名称、标题等。
现在,如果您想添加“image”的新字段,并对“title”字段进行更改约束,那么可以使用getter和setter添加“image”字段
/**
* @var string
*
* @ORM\Column(name="image", type="string", length=500)
*/
private $image;
/**
* 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;
}
并添加getter和setter
/**
* @var string
*
* @ORM\Column(name="image", type="string", length=500)
*/
private $image;
/**
* 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;
}
将标题的现有字段约束从长度255更新为500
好的…你已经根据你的需要做出了改变,你离改变只有一步之遥
步骤2:在项目目录中激发此命令
php bin/console doctrine:schema:update --force
现在,检查数据库中的表,完成了!!这就是我的工作方式:
- 在现有类中添加新的变量、setter和getter:
- 更新ORM文件:
- 运行bash命令:
在Symfony上的现有实体中添加新列。我也有同样的问题。在我长期研究之后,最好的解决方案就出现了
Symfony 4的解决方案工作
示例:
博客实体已在一个名称中创建
src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
php bin/console doctrine:schema:update --force
php bin/console make:entity Blog