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
Können Sie die tatsächliche Abfrage teilen, die gerade ausgeführt wird? –
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' –