Symfony 和 Doctrine 使迁移无效

Posted

技术标签:

【中文标题】Symfony 和 Doctrine 使迁移无效【英文标题】:Symfony and Doctrine making migration with no effect 【发布时间】:2018-08-01 05:21:29 【问题描述】:

Doctrine 正在 symfony 中生成迁移,并且在运行迁移之后没有任何变化,因此在下一个差异期间它是相同的。如何使 Doctrine 不产生这种迁移?手动运行 alter table 命令不会删除列排序规则。

bin/console doctrine:migration:diff

向上

$this->addSql('ALTER TABLE session CHANGE sess_id sess_id VARCHAR(128) NOT NULL');

向下

$this->addSql('ALTER TABLE session CHANGE sess_id sess_id VARCHAR(128) NOT NULL COLLATE utf8_unicode_ci');

表格是这样的:

show create table session;    

创建表session ( sess_id varchar(128) 整理 utf8_unicode_ci 非空, sess_data longblob 非空, sess_time int(11) 非空, sess_lifetime int(11) 非空, 主键 (sess_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

实体是在添加如下排序规则之后

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Session
 *
 * @ORM\Table(name="session")
 * @ORM\Entity(repositoryClass="App\Repository\SessionRepository")
 */
class Session

    /**
     * @var string
     *
     * @ORM\Column(name="sess_id", type="string", length=128, options="collation":"utf8_unicode_ci")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="sess_data", type="blob")
     */
    private $sessData;

    /**
     * @var int
     *
     * @ORM\Column(name="sess_time", type="integer")
     */
    private $sessTime;

    /**
     * @var int
     *
     * @ORM\Column(name="sess_lifetime", type="integer")
     */
    private $sessLifetime;


    /**
     * Get id
     *
     * @return string
     */
    public function getId()
    
        return $this->id;
    

    /**
     * Get sessData
     *
     * @return string
     */
    public function getSessData()
    
        return $this->sessData;
    

    /**
     * Set sessData
     *
     * @param string $sessData
     *
     * @return Session
     */
    public function setSessData($sessData)
    
        $this->sessData = $sessData;

        return $this;
    

    /**
     * Get sessTime
     *
     * @return int
     */
    public function getSessTime()
    
        return $this->sessTime;
    

    /**
     * Set sessTime
     *
     * @param integer $sessTime
     *
     * @return Session
     */
    public function setSessTime($sessTime)
    
        $this->sessTime = $sessTime;

        return $this;
    

    /**
     * Get sessLifetime
     *
     * @return int
     */
    public function getSessLifetime()
    
        return $this->sessLifetime;
    

    /**
     * Set sessLifetime
     *
     * @param integer $sessLifetime
     *
     * @return Session
     */
    public function setSessLifetime($sessLifetime)
    
        $this->sessLifetime = $sessLifetime;

        return $this;
    

【问题讨论】:

【参考方案1】:

我也遇到过类似的问题。

我用:

Symfony=3.4.9(弹性) 教义/orm=^2.5.11 PHP=7.2.5 cURL=7.59.0 APCu=5.1.11 Xdebug=2.6.0 作曲家=1.6.5 nginx=1.14.0 MariaDB=10.2.14

解决办法:

为了纠正我的问题,评论或在config/packages/doctrine.yaml中的属性server_version上设置值'mariadb-10.2.14'

深受启发:https://github.com/doctrine/dbal/issues/2985

【讨论】:

非常感谢!很高兴能解决这个问题。只是为了将来参考,如果有人需要找到他们的 MariaDB 版本来设置这个值,只需执行 SHOW VARIABLES LIKE "%version%"; 也可以在终端mysql -V执行查看mariadb版本。【参考方案2】:

尝试将此添加到列注释:

/**
 * @var string
 *
 * @ORM\Column(options="collation":"utf8_unicode_ci")
 */
private $sess_id;

【讨论】:

现在上下迁移完全一样 $this->addSql('ALTER TABLE session CHANGE sess_id sess_id VARCHAR(128) NOT NULL COLLATE utf8_unicode_ci'); 你有没有尝试运行这个:doctrine:clear:metadata:cache 清除缓存无效。我什至删除了整个 var/cache 文件夹【参考方案3】:

这是因为你创建了 $id 列,输入字符串,@ORM\GeneratedValue(strategy="AUTO")

删除:@ORM\GeneratedValue(strategy="AUTO")

【讨论】:

以上是关于Symfony 和 Doctrine 使迁移无效的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

Codeception & Symfony - 在测试前运行 Doctrine 迁移

Symfony2 和 Doctrine - 错误:无效的 PathExpression。必须是 StateFieldPathExpression

Symfony 4 / doctrine插入初始数据库数据

Symfony2 / Doctrine 使 $statement->execute() 不“缓冲”所有值

Symfony 2.4.2 作曲家迁移包