代码之家  ›  专栏  ›  技术社区  ›  Evgeniy Chorniy

如何优化Yii2哲学中的where条件

  •  0
  • Evgeniy Chorniy  · 技术社区  · 8 年前

    我有这个代码,并希望优化其中的条件写在例子中。我该怎么做:

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

    ->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 回复  |  直到 8 年前
        1
  •  0
  •   rob006    8 年前

    可以将其拆分为数组语法:

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

    但这并不能提高效率,也不能提高可读性。因此,除非您想在这个条件下做进一步的处理(在数组上做这个应该比在字符串上更容易),否则最好将这个条件保留为字符串。

        2
  •  0
  •   ChristopheBrun    8 年前

    不确定您在这里称之为“优化”,但您也可以尝试链接调用。

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