11

我有一个奇怪的问题:我有一个应用程序 symfony 2.3(使用奏鸣曲用户)我创建了一个包含一个实体的捆绑包 - 实体创建时没有问题,然后我不得不修改实体,现在似乎无法修改架构:

为了看看会发生什么,我用 +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 应该有长度=101,但是 dump-sql 给出了 nom VARCHAR(100) !

任何人都可以尝试找出问题所在吗?谢谢 !

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

我还尝试了--dump-sql 和--force。

这根本没有改变。欢迎任何提示!

4

9 回答 9

15

我刚刚解决了完全相同的问题:架构没有更新。

请注意,--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
于 2014-09-15T09:19:14.073 回答
11

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

orm:
   #auto_mapping: true

如果自动映射被禁用(或如上注释),您应该手动注册每个包的实体。

orm:
   entity_managers:
      default:
         mappings:
            AcmeHelloBundle: ~
于 2015-03-17T21:09:31.913 回答
6

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

php app/console doctrine:generate:entity

或者代替跑步

app/console doctrine:schema:update --force

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

于 2015-06-27T09:55:16.670 回答
2

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

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: {  }

我删除了这个文件夹,现在更新架构又可以工作了。

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

于 2013-11-11T12:55:16.107 回答
2

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

bin/console doctrine:schema:update --force
于 2017-12-28T05:35:42.157 回答
1

我认为这是因为教义:映射:导入命令。此命令将现有数据库的模式存储到 .orm.xml 文件中。可能你执行了这个命令。

我遇到了同样的问题,花了很多时间来找出答案。

于 2014-07-19T11:06:27.043 回答
1

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

于 2017-09-19T11:30:53.673 回答
-1

尝试

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

这是使用实体更新您的数据库架构

于 2013-11-11T08:21:51.997 回答
-1

输入php app/console help doctrine:schema:updateCLI

 --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在命令命名空间之前使用关键字,以获取该命令的帮助消息。

希望能帮助到你

于 2013-11-11T08:32:48.563 回答