在Yii2哲学的条件下,我如何优化这一点

时间:2018-09-13 13:10:49

标签: php yii2

我有这段代码,并希望优化示例中条件写入的位置。我该怎么做:

如何用另一种方法重写它,以使结果保持不变:

->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]
)

2 个答案:

答案 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();