在symfony的查询中组合两个变量

时间:2017-04-18 20:38:36

标签: php symfony doctrine

我对这可能是一个简单的问题有些麻烦。

我需要能够使用doctrine查询两个单独的变量作为键,但我不确定是否需要更新实体模式(我不是,而且似乎有点过分)能够做到这一点。

我目前需要在一个字段中的单个DQL查询中查询许多不同的项目。我一直在做这样的事情:

        $qb->select('r')->from('Bundle:Reviews\Review', 'r')
        ->leftJoin('Bundle:Bibliographies\PersonalName', 'p', 'WITH', 'p.biblio = r.id')
        ->leftJoin('r.biblio', 'bib')
        ->where( 'bib.author LIKE ?1 OR p.surname LIKE ?1' );
到目前为止一切顺利。我遇到的问题是,与ReviewName实体中的author不同,它包括姓氏和名字,像surname, givenName一样自动存储,在PersonalName表上(与参考书目一对多存在) ),两者都没有单一的字段。我有姓,但我真正需要的是这样的:

   ->where( 'bib.author LIKE ?1 OR "p.surname", "p.givenName" LIKE ?1' );

当然不会工作。

为了使这更简单,有没有办法做一些事情,比如在Repository中创建一个复合变量,将其定义为参数(例如$params[3]然后做这样的事情>

    ->where( 'bib.author LIKE ?1 OR ?3 LIKE ?1' );

否则,我可能会在实体中这样做,但我不完全确定如何做到这一点。

PersonalName实体具有以下内容:

    /**
 * @var string
 *
 * @ORM\Column(name="given_name", type="string", length=255, nullable=true)
 */
private $givenName;

/**
 * @var string
 *
 * @ORM\Column(name="surname", type="string", length=255, nullable=true)
 */
private $surname;

是否有一种简单的方法可以简单地创建一个新属性,该属性是surname和givenName的组合,而无需更新实体?我一直试图在手册中找到东西但是,唉,没有骰子。

任何帮助表示感谢。

编辑以澄清:

我真正需要的只是在我的where子句中给我这样的东西:

->where( 'bib.author LIKE ?1 OR (CONCAT(p.surname,CONCAT(", ",p.givenName)) LIKE ?1)' )

不幸的是,我在早期搜索姓氏或作者的子字符串时获得了非常好的结果,我现在得到的结果为零,这对我来说没什么意义,因为有一个明确的OR。我不知道这会破坏查询。

2 个答案:

答案 0 :(得分:1)

您可能想尝试此查询:

$qb->select('r')->from('Bundle:Reviews\Review', 'r')
        ->leftJoin('Bundle:Bibliographies\PersonalName', 'p', 'WITH', 'p.biblio = r.id')
        ->leftJoin('r.biblio', 'bib')
        ->where($qb->expr()->orX(
             $qb->expr()->like('bib.author', '?1')
             $qb->expr()->like('p.surname', '?2')
        ));

$qb->setParameter(1, $searchTerm);
$qb->setParameter(2, $searchTerm);

答案 1 :(得分:0)

好的,所以我从@ccKep那里得到的建议让我朝着正确的方向前进。但是,显然由于某些原因,DQL不喜欢单引号内的双引号。

这是对我有用的解决方案:

->where( "bib.author LIKE ?1 OR CONCAT(p.surname,CONCAT(', ',p.givenName)) LIKE ?1" )