2017-11-25 1 views
0

ich Doctrine2 in meinem Projekt verwende, und ich habe folgende Entitäten definiert:Doctrine2, ManyToMany Beziehung => SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung

namespace Model; 

/** 
* @Entity() 
* @Table(name="author") 
**/ 
class Author { 

    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="integer") 
    **/ 
    private $id; 

    /** @Column(type="string") **/ 
    private $firstName; 

    /** @Column(type="string") **/ 
    private $lastName; 

    /** @Column(type="string", nullable=true) **/ 
    private $titleBefore; 

    /** @Column(type="string", nullable=true) **/ 
    private $titleAfter; 

    /** @ManyToMany(targetEntity="Article", mappedBy="authors") **/ 
    private $articles; 

    public function __construct() { 
     $this->articles = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function getId() { 
     return $this->id; 
    } 

    public function getTitleBefore() { 
     return $this->titleBefore; 
    } 

    public function setTitleBefore($titleBefore) { 
     $this->titleBefore = $titleBefore; 
    } 

    public function getTitleAfter() { 
     return $this->titleAfter; 
    } 

    public function setTitleAfter($titleAfter) { 
     $this->titleAfter = $titleAfter; 
    } 

    public function getLastName() { 
     return $this->lastName; 
    } 

    public function setLastName($lastName) { 
     $this->lastName = $lastName; 
    } 

    public function getFirstName() { 
     return $this->firstName; 
    } 

    public function setFirstName($firstName) { 
     $this->firstName = $firstName; 
    } 

    public function getArticles() { 
     return $this->articles; 
    } 

    public function addArticle($article) { 
     $this->articles->add($article); 
    } 
} 

und

namespace Model; 

/** 
* @Entity() 
* @Table(name="article") 
**/ 
class Article { 

    /** 
    * @Id 
    * @GeneratedValue 
    * @Column(type="integer") 
    **/ 
    private $id; 

    /** @Column(type="string") **/ 
    private $name; 

    /** @OneToOne(targetEntity="Publication") **/ 
    private $publication; 

    /** 
    * @ManyToMany(targetEntity="Author", mappedBy="articles") 
    */ 
    private $authors; 

    public function __construct() { 
     $this->authors = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function getId() { 
     return $this->id; 
    } 

    public function getName() { 
     return $this->name; 
    } 

    public function setName($name) { 
     $this->name = $name; 
    } 

    public function getPublication() { 
     return $this->publication; 
    } 

    public function setPublication($publication) { 
     $this->publication = $publication; 
    } 

    public function getAuthors() { 
     return $this->authors; 
    } 

    public function addAuthor($author) { 
     $this->authors->add($author); 
     $author->addArticle($this); 
    } 

    public function setAuthors($authors) { 
     $this->authors = $authors; 
    } 
} 

Es sieht wie, diese Beziehung Autor < -> Artikel funktioniert gut. Obwohl ich auf ein Problem gestoßen bin. Wenn ich versuche, Autoren in Smarty Template zu den acces wie folgt aus: {foreach from=$article->getAuthors() item=author}, wird folgende Ausnahme ausgelöst:

Fatal error: Uncaught 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 'ON' at line 1 in /code/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:104 Stack trace: 
#0 /code/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php(104): PDO->query('SELECT t0.id AS...') 
#1 /code/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(852): Doctrine\DBAL\Driver\PDOConnection->query('SELECT t0.id AS...') 
#2 /code/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php(1030): Doctrine\DBAL\Connection->executeQuery('SELECT t0.id AS...', Array, Array) 
#3 /code/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php(954): Doctrine\ORM\Persisters\Entity\BasicEntityPersister->getManyToManyStatement(Array, Object(Model\Article)) 
#4 /code/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(2839): Doctrine\ORM\Persiste in /code/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php on line 90 

Ich habe bereits einen Tag auf diese und versuchen, herauszufinden, was schief gelaufen ist. Ich war misstrauisch, dass ich ein reserviertes MySQL-Wort verwenden könnte, aber ich habe in meinen Variablen keine gefunden.

Endlich gelang es mir, vollständige Abfragen zu erhalten, bis ich die Ausnahme bekam. Es sieht aus wie die interessanteste Abfrage nicht vorhanden ist

mysqld, Version: 5.7.20 (MySQL Community Server (GPL)). started with: 
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock 
Time     Id Command Argument 
2017-11-25T23:46:52.327597Z  10 Connect [email protected]_php_1.articlerepository_default on article_repository using TCP/IP 
2017-11-25T23:46:52.334083Z  10 Query  SELECT t0.id AS id_1, t0.firstName AS firstName_2, t0.lastName AS lastName_3, t0.titleBefore AS titleBefore_4, t0.titleAfter AS titleAfter_5 FROM author t0 
2017-11-25T23:46:52.342077Z  10 Query  SELECT t0.id AS id_1, t0.name AS name_2, t0.publication_id AS publication_id_3 FROM article t0 
2017-11-25T23:46:52.348058Z  10 Quit 
+0

Können Sie die tatsächliche Abfrage teilen, die gerade ausgeführt wird? –

+0

Ich bin nicht sicher, wie ich auf diese eine Abfrage zugreifen kann. Ich habe die Debugprotokollierung über https://pastebin.com/bBQLpENV aktiviert. Obwohl ich nur zwei Abfragen sehen kann, die direkt vor dieser Ausnahme ausgeführt wurden. SELECT t0.id AS ID_1, t0.firstName AS firstName_2, t0.lastName AS lastName_3, t0.titleBefore AS titleBefore_4, t0.titleAfter AS titleAfter_5 FROM author t0 und SELECT t0.id AS id_1, t0.name AS name_2, t0.publication_id AS publication_id_3 FROM Artikel t0' –

Antwort

0

Sieht aus wie ich eine Diskrepanz in meiner ManyToMany Beziehung hatte. Hier sind die Schritte, die ich nahm dieses Problem zu beheben:

  1. I aktuelles Schema fiel durch bin/doctrine orm:schema-tool:drop --force
  2. Validated aktuelle Einheiten mit Laufe bin/doctrine orm:validate mehrmals ausgeführt wird und Änderungen in Einheiten, bis sie ging durch ohne Fehler
  3. generierte neues Schema: bin/doctrine orm:schema-tool:update --force --dump-sql

Richtige Beziehung sieht wie folgt aus:

class Author { 
    /** 
    * @ManyToMany(targetEntity="Article", inversedBy="authors") 
    * @JoinTable(name="authors_articles") 
    **/ 
    private $articles; 
} 

class Article { 
    /** 
    * @ManyToMany(targetEntity="Author", mappedBy="articles") 
    */ 
    private $authors; 
} 

`

Verwandte Themen