我正在使用Symfony制作应用程序,我正在创建数据库和存储库。我需要创建一个查询,从表orders
中选择日期为今天(字段date
为datetime
)并且user
属性与{{1}匹配的位置变量或search
属性与product
变量匹配。匹配也必须不区分大小写。简单地说 - 用户选择日期(今天,所有时间或最近7天)并键入字符串,我需要获得指定日期(今天,所有时间或过去7天)的所有订单订单中的search
包含product
或search
属性包含user
。这是我到目前为止所拥有的
search
我必须匹配 $queryBuilder->
where('DATE_DIFF(orders.date, CURRENT_DATE()) = 0')->
andWhere("order.user LIKE '%search%'")->
setParameter('search',$search);
和user
属性,我需要匹配字符串的一部分,而不是整个字符串。
例如,如果用户搜索product
,我需要匹配用户mike
或产品Mike Johnson
。
我考虑过将mike
用于两者,但即使其他搜索都错误,它也会与日期匹配。所以我使用orWhere
,但是现在我应该如何添加第三个标准?我想在andWhere
中添加OR。
我在这里看到了许多答案,但其中大部分都是陈旧的。有些是5年前的。我不知道'DATE_DIFF'是否是正确的方法,或者addWhere
是否也是正确的方法。在使用Doctrine的Symfony中,我可以使用LIKE
进行简单查询并将其全部写下来。但是,我想使用queryBuilder的全部容量,并尽可能使用最少量的关键字,如SELECT
或“OR”(双关语)。
答案 0 :(得分:3)
尝试改变这个:
andWhere("order.user LIKE '%search%'")
到此:
andWhere("order.user LIKE '%search%' OR product.user LIKE '%search%'")
或者你可以尝试更复杂的东西(我现在没有尝试过,但概念很清楚):
$queryBuilder
->where('DATE_DIFF(orders.date, CURRENT_DATE()) = 0')
->andWhere($qb->expr()->orX(
$qb->expr()->like('order.user', '%search%'),
$qb->expr()->like('product.user', '%search2%')
))
setParameters(
[
'search' => $search,
'search2' => $search,
]
);