【问题标题】:Doctrine: querying entities with composite foreign key学说:使用复合外键查询实体
【发布时间】:2016-01-14 10:33:37
【问题描述】:

设置

我有三个实体:

  • 词表
  • WordInWordlist
  • 定义

WordList 与 WordInList 具有 OneToMany 关系。 WordInList 与 Definition 具有 OneToMany 关系


我正在尝试什么

我正在尝试查询 word_id = 的所有定义行?和 wordlist_id = ?.

在标准 SQL 中,我会写以下内容:

SELECT * FROM definition WHERE word_wordlist_word_id = ? AND word_wordlist_wordlist_id = ?;

代码片段

WordInWordlist实体的适用部分为吹:

class WordInWordlist
{   
    /**
     *
     * @ORM\OneToMany(targetEntity="Definition", mappedBy="wordInWordlist")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="word_id", referencedColumnName="word_wordlist_word_id"),
     *   @ORM\JoinColumn(name="wordlist_id", referencedColumnName="word_wordlist_wordlist_id")
     * })
     * @Expose()
     **/
    protected $definitions;


    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Wordlist", inversedBy="wordInWordlist")
     * @ORM\JoinColumn(name="wordlist_id", referencedColumnName="id")
     **/
    protected $wordlist;

定义实体的适用部分如下:

class Definition
{

    /**
     * @ORM\ManyToOne(targetEntity="WordInWordlist", inversedBy="definitions")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="word_wordlist_word_id", referencedColumnName="word_id"),
     *   @ORM\JoinColumn(name="word_wordlist_wordlist_id", referencedColumnName="wordlist_id")
     * })
     **/
    protected $wordInWordlist;

我的尝试

1

public function getDefinitions($wordlist_id, $word_id)
{
    $query = $this->createQueryBuilder('d')
      ->where('d.word_wordlist_word_id = :word_id')
      ->andWhere('d.word_wordlist_wordlist_id = :wordlist_id')
      ->setParameter('word_wordlist_word_id', $word_id)
      ->setParameter('word_wordlist_wordlist_id', $wordlist_id)
      ->getQuery();

    return $query->getResult();
}

结果:

PHP Fatal error:  Uncaught Doctrine\ORM\Query\QueryException: SELECT d FROM Spellingbee\Business\Entity\Definition d WHERE d.word_wordlist_word_id = :word_id AND d.word_wordlist_wordlist_id = :wordlist_id in /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:41 Stack trace:
#0 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(483): Doctrine\ORM\Query\QueryException::dqlError('SELECT d FROM S...')
#1 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(758): Doctrine\ORM\Query\Parser->semanticalError('line 0, col 63 ...', Array)
#2 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(279): Doctrine\ORM\Query\Parser->processDeferredPathExpressions(Object(Doctrine\ORM\Query\AST\SelectStatement))
#3 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(351): Doctrine\ORM\Query\Parser->getAST()
#4 /home/dporter/projects/lis in /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php on line 63

2

public function getDefinitions($wordlist_id, $word_id)
{
    $query = $this->createQueryBuilder('d')
      ->where('d.wordInWordlist = :wordlist_id')
      ->setParameter('wordlist_id', array(
        'word' => $word_id,
        'wordlist' => $wordlist_id
        )
      )
      ->getQuery();

    return $query->getResult();
}

结果:

Fatal error: Uncaught Doctrine\ORM\Query\QueryException: A single-valued association path expression to an entity with a composite primary key is not supported. Explicitly name the components of the composite primary key in the query. in /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:235 Stack trace:
#0 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php(676): Doctrine\ORM\Query\QueryException::associationPathCompositeKeyNotSupported()
#1 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/AST/PathExpression.php(79): Doctrine\ORM\Query\SqlWalker->walkPathExpression(Object(Doctrine\ORM\Query\AST\PathExpression))
#2 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php(2295): Doctrine\ORM\Query\AST\PathExpression->dispatch(Object(Doctrine\ORM\Query\SqlWalker))
#3 /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php in /home/dporter/projects/list_management/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php on line 235

问题

如何创建一个原则查询来获得我在上面“我正在尝试什么”部分中概述的结果。

谢谢

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

    你试试这种方式,你方法的签名是数组吗?

    public function getDefinitions(array $ids)
    {
     $query = $this->createQueryBuilder('d')
      ->where('d.wordInWordlist IN (:wordlist_id)')
      ->setParameter('wordlist_id', $ids)
      ->getQuery();
    
     return $query->getResult();
    }
    

    希望对你有帮助。

    【讨论】:

    • 这不起作用。 IN 子句用于获取实体集合。事实证明,我想要完成的事情不受 Doctrine 的支持(Yet?)。我发现代码中的评论说的一样多。
    【解决方案2】:

    不幸的是,Doctrine 不允许我尝试的查询(这似乎很基本)。使用 DQL 或查询生成器的唯一方法是加入逆向表并按适当的字段进行过滤。

    所以这是我的最终结果:

    public function getDefinitions($wordlist_id, $word_id)
    {
        $query = $this->createQueryBuilder('d')
          ->innerJoin('d.wordInWordlist', 'w')
          ->where('w.wordlist = :wordlist')
          ->andWhere('w.word = :word')
          ->setParameters(array(
            'word' => $word_id,
            'wordlist' => $wordlist_id
            )
          )
          ->getQuery();
    
        return $query->getResult();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多