Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原则:使用复合外键查询实体 设置_Php_Symfony_Orm_Doctrine Orm - Fatal编程技术网

Php 原则:使用复合外键查询实体 设置

Php 原则:使用复合外键查询实体 设置,php,symfony,orm,doctrine-orm,Php,Symfony,Orm,Doctrine Orm,我有三个实体: 词表 单词列表 定义 WordList与WordInList有一个OneToMany关系。 WordInList与Definition之间有一种单一的关系 我在尝试什么 我试图查询所有定义行,其中单词_id=?单词列表_id= 在标准SQL中,我将编写以下内容: SELECT * FROM definition WHERE word_wordlist_word_id = ? AND word_wordlist_wordlist_id = ?; 代码片段 WordInWo

我有三个实体:

  • 词表
  • 单词列表
  • 定义
WordList与WordInList有一个OneToMany关系。 WordInList与Definition之间有一种单一的关系


我在尝试什么 我试图查询所有定义行,其中单词_id=?单词列表_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. 结果:

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. 结果:

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

问题: 如何创建条令查询以获得我在上文“我在尝试什么”一节中概述的结果


谢谢

您是否尝试过这样做,方法的签名是数组

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

 return $query->getResult();
}

希望它能帮助您。

不幸的是,条令不允许我尝试的查询(这似乎很基本)。使用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();
}

这是行不通的。IN子句用于获取实体集合。事实证明,我想要完成的事情并没有得到教义的支持。我发现注释在代码中也表达了同样的意思。
public function getDefinitions(array $ids)
{
 $query = $this->createQueryBuilder('d')
  ->where('d.wordInWordlist IN (:wordlist_id)')
  ->setParameter('wordlist_id', $ids)
  ->getQuery();

 return $query->getResult();
}
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();
}