Ошибка SQL приспособления наследования таблицы классов Symfony 2

Я здесь новичок и совершенно не знаком с Symfony 2.

Я пытаюсь создать Entity «MailProcess», который наследуется от Entity «Process». Вот мои определения сущности:

// src/MW/TodoBundle/Entity/Process.php
namespace MW\TodoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity 
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="process_type", type="string")
 * @ORM\DiscriminatorMap({"mailprocess" = "MailProcess", "process" = "Process"})
 * @ORM\Table(name="process")
 * @ORM\HasLifecycleCallbacks 
 */
class Process
{

    /**
     *
     * @ORM\Id
     * @ORM\Column(type="integer", unique=true)
     * @ORM\GeneratedValue(strategy="AUTO") 
     */
    protected $id;

    /**
     *
     * @ORM\Column(type="string") 
     */
    protected $title;

    /**
     *
     * @ORM\Column(type="datetime") 
     */
    protected $created;



    /**
     *
     * @ORM\Column(type ="text", nullable= true)
     */
    protected $comment;
    protected $options;

    // Getters and Setters
}

// src/MW/TodoBundle/Entity/MailProcess.php
namespace MW\TodoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use MW\TodoBundle\Entity\Process;

/**
 *
 * @ORM\Entity
 * @ORM\Table(name="process_mailprocess")
 */
class MailProcess extends Process
{

    /**
     *
     * @ORM\Column(type="string") 
     */
    protected $from;

    /**
     *
     * @ORM\Column(type="string") 
     */
    protected $to;

    /**
     *
     * @ORM\Column(type="string", nullable=true) 
     */
    protected $subject;

    /**
     *
     * @ORM\Column(type="text", nullable=true) 
     */
    protected $message;
}

Вы можете увидеть используемое наследование таблицы классов ORM: две таблицы «process» и «process_mailprocess» со столбцом дискриминатора «process_type».

Я использую «php app/console doctrine:schema:update --force» для обновления схемы в моей базе данных MySQL, которая отлично работает.

Но есть и мои фикстуры данных: здесь я сократил их до одного, но будьте уверены, что у меня есть дополнительные фикстуры, которые также тестируют Entity 'Process', которые работают нормально.

// src/MW/TodoBundle/DataFixtures/ORM/ProcessFixtures.php

namespace MW\TodoBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use MW\TodoBundle\Entity\Process;
use MW\TodoBundle\Entity\MailProcess;

class ProcessFixtures implements FixtureInterface
{

    public function load(ObjectManager $manager)
    {
        $mp1= new MailProcess();
        $mp1->setTitle("Invoice from heaven")
            ->setComment("sitebot: Irgendwer will was von euch!")
            ->setCreated(new \DateTime())
            ->setFrom("m")
            ->setTo("m")
            ->setSubject("m")
            ->setMessage("m");
        $manager->persist($mp1);
        $manager->flush();
    }
}

Увы, выполнение «доктрина приложения/консоли php:fixtures:load» с подтверждением «y» для очистки заставляет меня

  [Doctrine\DBAL\DBALException]
  An exception occurred while executing 'INSERT INTO process_mailprocess (id, from, to, subject, message) VALUES (?,
  ?, ?, ?, ?)' with params {"1":28,"2":"m","3":"m","4":"m","5":"m"}:

  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 'from, to, subject, message) VALUES ('28
  ', 'm', 'm', 'm', 'm')' at line 1






  [PDOException]
  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 'from, to, subject, message) VALUES ('28
  ', 'm', 'm', 'm', 'm')' at line 1

Я не вижу в этом ничего плохого, кроме того, Doctrine и Symfony создают SQL-запрос. Может ли кто-нибудь указать мне, что я делаю неправильно здесь? Это настоящая головная боль для меня.


person marc    schedule 08.03.2013    source источник


Ответы (1)


Я думаю, вы получаете синтаксическую ошибку, потому что from является зарезервированным словом в MySql. Вы можете установить имя столбца в своей аннотации и указать его правильно.

/**
 *
 * @ORM\Column(type="string", name="`from`") 
 */
protected $from;
person Bram Gerritsen    schedule 08.03.2013
comment
Спасибо большое, вы действительно правы. В сочетании с экранированием зарезервированного TO это работает правильно, как и ожидалось. - person marc; 09.03.2013