[英]Doctrine2, ManyToMany relation => SQLSTATE[42000]: Syntax error or access violation
我在項目中使用Doctrine2,並且定義了以下實體:
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);
}
}
和
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;
}
}
看起來,關系作者<->文章運行良好。 雖然我遇到了問題。 當我嘗試像這樣在Smarty模板中訪問作者: {foreach from=$article->getAuthors() item=author}
,拋出以下異常:
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
我已經花了一天的時間,試圖找出問題所在。 我很懷疑,我可能會使用保留的MySQL字,但在變量中沒有找到任何字。
我終於設法獲得了完整的查詢日志,直到得到異常。 看起來,最有趣的查詢不存在
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 user@articlerepository_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
看起來我的ManyToMany關系不匹配。 這是我為解決此問題而采取的步驟:
bin/doctrine orm:schema-tool:drop --force
刪除了當前模式 bin/doctrine orm:validate
驗證當前實體bin/doctrine orm:validate
多次bin/doctrine orm:validate
並更改實體,直到沒有錯誤通過 bin/doctrine orm:schema-tool:update --force --dump-sql
正確的關系如下所示:
class Author {
/**
* @ManyToMany(targetEntity="Article", inversedBy="authors")
* @JoinTable(name="authors_articles")
**/
private $articles;
}
class Article {
/**
* @ManyToMany(targetEntity="Author", mappedBy="articles")
*/
private $authors;
}
`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.