Benjamin Crouzier
Benjamin Crouzier

Reputation: 41965

Symfony doctrine::build task cannot create table named order

I have a database with a table named order. When i run php symfony doctrine:build --all, i got the folowing error:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order (id BIGINT AUTO_INCREMENT, status VARCHAR(255), colissimonumber VARCHAR(25' at line 1. Failing Query: "CREATE TABLE order (id BIGINT AUTO_INCREMENT, status VARCHAR(255), colissimonumber VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = MyISAM".

The problem is clearly that order has no backquotes arount it (if i run manually the query in phpmyadmin with backquotes, it works)

How do i tell doctrine to add backquotes around table and field names? Any workaround exept renaming my table ?

I run symfony 1.4.9 with doctrine 1.2

Upvotes: 2

Views: 1718

Answers (3)

Hamza Rashid
Hamza Rashid

Reputation: 1397

Got similar error when upgrading from MySQL 5.7 to MySQL 8.0. RANK() is a function added in MySQL 8.0 whereas one of the table in our database has rank as column name.

My Setup:

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

Here are three possible solutions.

Solution 1: Add quote_identifier: true in config/databases.yml file. Also, clear cache after change in configuration with php symfony cc or php symfony cache:clear.

all:
  doctrine:
    param:
      attributes:
        quote_identifier: true

Solution 2: Turn on Doctrine_Core::ATTR_QUOTE_IDENTIFIER in config/ProjectConfiguration.class.php file on configureDoctrine() method.

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

Solution 3: Turn on Doctrine_Core::ATTR_QUOTE_IDENTIFIER on specific table(s) which are potentially breaking the system.

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

Note: From Doctrine 1 docs

Just because you CAN use delimited identifiers, it doesn't mean you SHOULD use them. In general, they end up causing way more problems than they solve. Anyway, it may be necessary when you have a reserved word as a field name (in this case, we suggest you to change it, if you can).

Upvotes: 0

Dziamid
Dziamid

Reputation: 11599

You probably want your model to be named Order, but this doesn't mean that the corresponding RDBMS table must be named the same.

Order:
  tableName: project_order
  columns: ...

Upvotes: 3

prodigitalson
prodigitalson

Reputation: 60413

You can turn on Doctrine_Core::ATTR_QUOTE_IDENTIFIER in your doctrine configuration mthod on projectConfiguration which will quote tables and col names but its not recommended:

Just because you CAN use delimited identifiers, it doesn't mean you SHOULD use them. In general, they end up causing way more problems than they solve. Anyway, it may be necessary when you have a reserved word as a field name (in this case, we suggest you to change it, if you can).

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

Upvotes: 5

Related Questions