我对这可能是一个简单的问题有些麻烦。
我需要能够使用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
。我不知道这会破坏查询。
答案 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" )