【问题标题】:Symfony doctrine::build task cannot create table named orderSymfony 学说::build 任务无法创建名为 order 的表
【发布时间】:2011-08-12 09:32:57
【问题描述】:

我有一个数据库,其中有一个名为order 的表。 当我运行php symfony doctrine:build --all 时,出现以下错误:

SQLSTATE[42000]:语法错误或 访问冲突:1064 你有一个 SQL 语法错误;检查 对应于您的 MySQL 的手册 正确语法的服务器版本 在'订单附近使用(id BIGINT AUTO_INCREMENT,状态 VARCHAR(255), colissimonumber VARCHAR(25' 在第 1 行。 查询失败:“CREATE TABLE 订单(id BIGINT AUTO_INCREMENT,状态 VARCHAR(255),大肠杆菌数 VARCHAR(255) 非空,created_at DATETIME 不为 NULL,updated_at DATETIME 非空,主键(id))引擎= MyISAM”。

问题显然是订单周围没有反引号(如果我在 phpmyadmin 中手动运行带有反引号的查询,它可以工作)

我如何告诉教义在表名和字段名周围添加反引号?除了重命名我的表之外的任何解决方法?

我运行 symfony 1.4.9 和学说 1.2

【问题讨论】:

    标签: mysql symfony1 doctrine


    【解决方案1】:

    您可以在projectConfiguration 上的学说配置方法中打开Doctrine_Core::ATTR_QUOTE_IDENTIFIER,这将引用表和列名,但不推荐:

    仅仅因为你可以使用 delimited 标识符,这并不意味着你 应该使用它们。一般来说,他们结束 造成比他们更多的问题 解决。无论如何,这可能是必要的 当你有一个保留字作为 字段名称(在这种情况下,我们建议 如果可以的话,您可以更改它)。

    http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en#identifier-quoting

    【讨论】:

    • 在旁注中,您也可以在 databases.yml 中执行此操作:属性:{ quote_identifier: true }
    【解决方案2】:

    您可能希望您的模型命名为 Order,但这并不意味着相应的 RDBMS 表必须命名相同。

    Order:
      tableName: project_order
      columns: ...
    

    【讨论】:

      【解决方案3】:

      从 MySQL 5.7 升级到 MySQL 8.0 时出现类似错误。 RANK() 是 MySQL 8.0 中添加的一个函数,而我们数据库中的一个表以 rank 作为列名。

      我的设置:

      - Symfony 1.5
      - Doctrine 1.2
      - PHP 7.4.24
      - MySQL 8.0.27
      - Ubuntu 20.04.1
      

      这里有三种可能的解决方案。

      Solution 1:config/databases.yml 文件中添加quote_identifier: true。此外,在使用php symfony ccphp symfony cache:clear 更改配置后清除缓存。

      all:
        doctrine:
          param:
            attributes:
              quote_identifier: true
      

      Solution 2:在config/ProjectConfiguration.class.php文件中开启Doctrine_Core::ATTR_QUOTE_IDENTIFIERconfigureDoctrine()方法。

      $conn = Doctrine_Manager::getInstance()->getCurrentConnection();
      $conn->setAttribute(Doctrine_Core::ATTR_QUOTE_IDENTIFIER, true);
      

      Solution 3:在可能破坏系统的特定表上打开Doctrine_Core::ATTR_QUOTE_IDENTIFIER

      $table = Doctrine_Core::getTable('table_name');
      $table->setAttribute(Doctrine_Core::ATTR_QUOTE_IDENTIFIER, true);
      

      注意:From Doctrine 1 docs

      仅仅因为您可以使用分隔标识符,这并不意味着您 应该使用它们。一般来说,它们最终会导致更多问题 比他们解决的。无论如何,当您有预订时可能需要 word 作为字段名称(在这种情况下,我们建议您更改它,如果 你可以)。

      【讨论】:

        猜你喜欢
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 2016-11-09
        相关资源
        最近更新 更多