如何在 Yii2 中创建和分组 OR LIKE 多列查询?

pio*_*eer 2 mysql sql yii2

如何使用查询生成器在 Yii2 中创建这样的查询?

SELECT * 
FROM blog 
WHERE status = 1 AND (
    author_username LIKE '%Steve%' 
    OR author_first_name LIKE '%Steve%' 
    OR author_last_name LIKE '%Steve%'
)
Run Code Online (Sandbox Code Playgroud)

我正在尝试找到在搜索模型中使用它的正确方法。

小智 5

有很多方法可以实现这个查询:

  1. 使用PDO:

    $q='Stev';
    Yii::$app->db->createCommand('
        SELECT * 
        FROM blog 
        WHERE status = 1 AND (
            author_username LIKE :Q 
            OR author_first_name LIKE :Q 
            OR author_last_name LIKE :Q
        )
        ',['Q'=>"%$q%"])
        ->queryAll();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用yii\db\Query:

    $condition = [
        'OR',                               //Operand (C1 OR C2)
        [                                   //Condition1 (C1) which is complex
            'OR',                           //Operand (C1.1 OR C1.2)
            ['like','author_username',$q],  //C1.1
            ['like','author_first_name',$q] //C1.2
        ],
        ['like','author_last_name',$q]      //Condition2(C2)
    ];
    
    (new yii\db\Query())
        ->from('blog')
        ->andWhere('status = 1')
        ->andWhere($condition)
        ->all();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用ActiveRecord (ActiveQuery):

    Blog::find()
    ->active()
    ->andWhere($condition)
    ->all();
    
    Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法测试您的查询QueryBuilder:

var_dump(Yii::$app->db->queryBuilder->build($your_query));
Run Code Online (Sandbox Code Playgroud)