簡體   English   中英

Doctrine2,ManyToMany關系=> SQLSTATE [42000]:語法錯誤或訪問沖突

[英]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關系不匹配。 這是我為解決此問題而采取的步驟:

  1. 我通過運行bin/doctrine orm:schema-tool:drop --force刪除了當前模式
  2. 使用bin/doctrine orm:validate驗證當前實體bin/doctrine orm:validate多次bin/doctrine orm:validate並更改實體,直到沒有錯誤通過
  3. 生成的新架構: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM