【问题标题】:Symfony and Doctrine making migration with no effectSymfony 和 Doctrine 使迁移无效
【发布时间】: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;
    }
}

【问题讨论】:

    标签: php mysql symfony doctrine-orm doctrine


    【解决方案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")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-06
      • 2019-10-30
      • 1970-01-01
      • 2018-10-17
      • 2018-07-09
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多