【问题标题】:Can't use JOIN with related entities in doctrine2不能将 JOIN 与学说 2 中的相关实体一起使用
【发布时间】:2013-12-05 17:01:57
【问题描述】:

我是guided by this,但我不明白出了什么问题。

我的实体:

/**
 * @ORM\Entity
 * @ORM\Table(name="term")
 */
class Term {
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\OneToMany(targetEntity="Description", mappedBy="term")
     **/ 
    private $description;

    //....
}

/**
 * @ORM\Entity
 * @ORM\Table(name="description")
 */
class Description {

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @Orm\ManyToOne(targetEntity="term", inversedBy="description")
     * @Orm\JoinColumn(name="term_id", referencedColumnName="id")
     **/  
    private $term;
    /**
     * @ORM\Column(type="string", length=8)
     */
    private $normativity;
    //...
}

我需要通过其中一个字段(例如规范性)获取术语并过滤术语描述。

我试过这个:

$query = $this->getDoctrine()->getEntityManager()
    ->createQuery("
        SELECT term, desc FROM myTerminologyBundle:Term term
        JOIN term.description desc
        WHERE term.word LIKE :r_word' and desc.normativity IN :norm"         
    )->setParameter('r_word', '%'.$word.'%')->setParameter('norm', array());

我得到以下异常:

[语法错误] 第 0 行,第 30 列:错误:预期的标识变量 |标量表达式 |聚合表达式 |功能声明 | 部分对象表达式 | "(" 子选择 ")" | CaseExpression,得到 '描述'

【问题讨论】:

    标签: php sql symfony doctrine-orm


    【解决方案1】:

    试试这样的:

    createQuery("
        SELECT term
        FROM myTerminologyBundle:Term term
        INNER JOIN myTerminologyBundle:Description desc
        WHERE term.word LIKE :r_word' and desc.normativity IN :norm"         
    )
    

    【讨论】:

    • 我什至没有尝试过,但看起来在您的查询中我会得到描述实体?我需要 Term,其描述具有规范性 = somevalues
    • 我得到 [Syntax Error] line 0, col 130: Error: Expected Doctrine\ORM\Query\Lexer::T_WITH, got 'ON'
    • 你需要Term的哪些属性?
    • 我需要整个 Term 实体。我需要带有过滤描述的术语。
    【解决方案2】:

    使用 dql

    $query= $this->getEntityManager()
                            ->createQueryBuilder()
                            ->select('term.id as id,term.name as name')
                            ->from('FROM myTerminologyBundle:Term ', 'term')
                            ->innerJoin('term.Description ', 'desc')
                            ->Where('term.word LIKE=:term')
                            ->setParameters(array('term' => $term))
                             ->orWhere('desc.normativity  IN(:category_id)')
                            ->setParameter('category_id',$category_id)
    
                            ->getQuery();
                 return $query->getResult();
    

    【讨论】:

      【解决方案3】:

      SQL中有保留字desc。我将其更改为另一个,它可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多