Symfony doctrine:schema:update not working

问题描述 投票:9回答:9

我有一个奇怪的问题:我有一个应用程序symfony 2.3(与sonata用户)我创建了一个包含一个实体 - 实体创建没有问题然后我不得不修改实体现在似乎无法修改模式:

为了看看会发生什么,我用+1增加了所有的字符串长度

实体代码(带注释):

namespace Too\ConfigAppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * ConfigApp
 *
 * @ORM\Table(name="ConfigApp")
 * @ORM\Entity(repositoryClass="Too\ConfigAppBundle\Entity\ActiviteRepository")
 */
class ConfigApp
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $nom
     *
     * @ORM\Column(name="nom", type="string", length=101, unique=true)
     */
    private $nom;

    /**
     * @var string $nomSlug
     *
     * @Gedmo\Slug(fields={"nom"}, updatable=true, separator="_")
     * @ORM\Column(name="nomSlug", type="string", length=101, nullable=true)
     */
    private $nomSlug;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=151)
     */
    private $email;

    /**
     * @var string $telephone
     *
     * @ORM\Column(name="telephone", type="string", length=16)
     */
    private $telephone;

    /**
     * @var datetime $cree_le
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="cree_le", type="datetime")
     */
    private $cree_le;

    /**
     * @var datetime $modifie_le
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="modifie_le", type="datetime")
     */
    private $modifie_le;

    ...

现在看看结果:

php app/console doctrine:schema:update --dump-sql

CREATE TABLE ConfigApp (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(100) NOT NULL, nomSlug VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL, telephone VARCHAR(15) NOT NULL, cree_le DATETIME NOT NULL, modifie_le DATETIME NOT NULL, PRIMARYKEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB

没有考虑新的长度:例如,字段nom应该有length = 101,但dump-sql给出了nom VARCHAR(100)!

任何人都可以试着弄清楚什么是错的?谢谢 !

编辑:我之前尝试清除缓存:* php app / console doctrine:cache:clear-metadata * php app / console cache:clear *删除缓存文件夹中的所有内容

我也试过--dump-sql和--force。

这根本不会改变。请提示任何提示!

php symfony doctrine-orm
9个回答
10
投票

我刚刚完成了同样的问题:架构没有更新。

请注意, - force返回与--dump-sql完全相同的东西,唯一的区别是--force对数据库运行SQL。

虽然,在我的情况下,问题不是因为.orm.xml文件。这是因为我在config_dev.xml中设置了它:

doctrine:
orm:
    metadata_cache_driver:
        type: memcached
        host: localhost
        port: 11211
        instance_class: Memcached
    query_cache_driver:
        type: memcached
        host: localhost
        port: 11211
        instance_class: Memcached
    result_cache_driver:
        type: memcached
        host: localhost
        port: 11211
        instance_class: Memcached

即使我经常发誓:

php app/console cache:clear

memcached数据未刷新。所以我不得不重新启动memcached,然后一切都恢复正常运行!

所以,谢谢你的问题,它让我在我的情况下找到了正确的位置。

更新:正如Phil上面提到的,运行此命令也可以解决问题:

php app/console doctrine:cache:clear-metadata

10
投票

您可能忘记启用Doctrine自动映射;

orm:
   #auto_mapping: true

如果禁用自动映射(或如上所述进行注释),则应手动注册每个包的实体。

orm:
   entity_managers:
      default:
         mappings:
            AcmeHelloBundle: ~

4
投票

运行时尝试使用YAML而不是默认注释

php app/console doctrine:generate:entity

或者不是跑步

app/console doctrine:schema:update --force

您可以手动创建MySql表,这是一项非常繁琐的任务


1
投票

我找到了解决方案:我之前没有看到,但src \ Too \ ConfigAppBundle \ Resources \ config中有一个包含名为ConfigApp.orm.yml的文件的doctrine文件夹:

Too\ConfigAppBundle\Entity\ConfigApp:
    type: entity
    table: null
    repositoryClass: Too\ConfigAppBundle\Entity\ConfigAppRepository
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
        nom:
            type: string
            length: '100'
        nomSlug:
            type: string
            length: '100'
        email:
            type: string
            length: '150'
        telephone:
            type: string
            length: '15'
        cree_le:
            type: datetime
            length: null
        modifie_le:
            type: datetime
            length: null
    lifecycleCallbacks: {  }

我删除了这个文件夹,现在再次更新架构。

当然我做了一些东西来生成这个学说文件夹,但我不知道它是什么 - 如果有人能告诉我这些东西是如何生成的 - 为什么?


1
投票

我认为这是因为学说:mapping:import命令。此命令将现有数据库的模式存储到.orm.xml文件中。可能你执行这个命令。

我有同样的问题,让我花了很多时间才能找到答案。


1
投票

因为我使用的是.orm.yml-mapping,我遇到的问题是我创建了doctrine文件夹,其中yml映射存在于错误的路径下,所以我通过将doctrine文件夹移动到config文件夹来修复它:...\BundleName\Resources\config\doctrine\MyEntity.orm.yml


0
投票

在CLI中键入php app/console help doctrine:schema:update

 --dump-sql            Dumps the generated SQL statements to the screen (does no
t execute them).

...

 --force               Causes the generated SQL statements to be physically exec
uted against your database.

所以试试--force而不是--dump-sql

这是缓存清除的命令:

php app/console cache:clear

不要忘记在命令命名空间之前使用help关键字以获取该命令的帮助消息。

希望能帮助到你


0
投票

虽然@rai和其他人提供的一些答案都是正确的,但是Symfony版本的另一个建议是等于或高于3.0,请使用bin / console代替app / console,如下所示,

bin/console doctrine:schema:update --force

-1
投票

尝试

php app/console doctrine:schema:update --force

这是使用实体更新数据库模式

© www.soinside.com 2019 - 2024. All rights reserved.