我有这段代码,并希望优化示例中条件写入的位置。我该怎么做:
如何用另一种方法重写它,以使结果保持不变:
->where(
"(b.updated_at is null
OR u.updated_at > b.updated_at
OR i.updated_at > b.updated_at
) AND (
u.last_name <> ''
OR u.first_name <> ''
) AND (
u.updated_at > :seconds
OR i.updated_at > :seconds
)",
['seconds' => $seconds]
)
答案 0 :(得分:0)
您可以将其拆分为数组语法:
->where(
[
'AND',
[
'OR',
'b.updated_at is null',
'u.updated_at > b.updated_at',
'i.updated_at > b.updated_at',
],
[
'OR',
"u.last_name <> ''",
"u.first_name <> ''",
],
[
'OR',
'u.updated_at > :seconds',
'i.updated_at > :seconds',
],
],
['seconds' => $seconds]
)
但是,这不会使它更有效也不可读。因此,除非您想对此条件做一些进一步的处理(在数组上比在字符串上做起来要容易得多),否则最好将此条件保留为字符串。
答案 1 :(得分:0)
不确定在这里您所说的“优化”是什么,但是您也可以尝试链接呼叫。
恕我直言,它使查询更具可读性-即使最后生成的SQL是相同的:
->where("b.updated_at is null OR u.updated_at > b.updated_at OR i.updated_at > b.updated_at")
->andWhere("u.last_name <> '' OR u.first_name <> ''")
->andWhere("u.updated_at > :seconds OR i.updated_at > :seconds", ['seconds' => $seconds])->all();