【问题标题】:Yii2 custom paginaion for Union query用于联合查询的 Yii2 自定义分页
【发布时间】:2017-09-11 01:03:11
【问题描述】:

我想在 Yii2 中实现自定义分页。这是我的代码

$connection = Yii::$app->getDb();
$name       =   $_GET['name'];
$query      =   '
                SELECT name FROM user WHERE name LIKE "%.'$name'.%"" 
            UNION
                SELECT name FROM user2 WHERE name LIKE "%.'$name'.%"" 
            UNION
                SELECT name FROM user3 WHERE name LIKE "%.'$name'.%"" 
            UNION
                SELECT name FROM user4 WHERE name LIKE "%.'$name'.%"" 
            ';              
$result      = $connection->createCommand($query)->queryAll();

请告诉我如何在 Yii2 中实现分页

【问题讨论】:

    标签: pagination yii2-advanced-app


    【解决方案1】:

    请试试这个

    $totalCount =   0;
    
    $name       = $_GET['name'];
    $connection = Yii::$app->getDb();
    $limit      =   10;
    
    $from       =   (isset($_GET['page'])) ? ($_GET['page']-1)*$limit : 0; // Match according to your query string
    
    $sql        =   '
                SELECT name FROM user WHERE name LIKE "%.'$name'.%"" 
            UNION
                SELECT name FROM user2 WHERE name LIKE "%.'$name'.%"" 
            UNION
                SELECT name FROM user3 WHERE name LIKE "%.'$name'.%"" 
            UNION
                SELECT name FROM user4 WHERE name LIKE "%.'$name'.%"" 
            ';
    $command = $connection->createCommand($sql.' LIMIT '.$from.','.$limit);
    
    $count   = $connection->createCommand('SELECT COUNT(*) as total FROM ('.$sql.') a')->queryAll();
    
    $result         = $command->queryAll();
    
    $totalCount     =   $count[0]['total'];
    
    $pages = new Pagination(['totalCount' => $totalCount, 'pageSize' => $limit]);       
    

    【讨论】:

      【解决方案2】:

      这里有一个更合适的 Yii2 方式:

      在控制器中:

          $page = Yii::$app->request->get('page', 1);
          $limit = Yii::$app->request->get('per-page', 10);
          $from = ($page-1)*$limit; 
      
          //Get the db connection
          $db = new yii\db\Connection(Yii::$app->db);
      
          //prepare SQL query
          $sql = '
                  SELECT name FROM user WHERE name LIKE "%.'$name'.%"" 
              UNION
                  SELECT name FROM user2 WHERE name LIKE "%.'$name'.%"" 
              UNION
                  SELECT name FROM user3 WHERE name LIKE "%.'$name'.%"" 
              UNION
                  SELECT name FROM user4 WHERE name LIKE "%.'$name'.%"" 
              ';
      
          //Fire it!
          $result =   $db->createCommand($sql.' LIMIT '.$from.','.$limit)->queryAll();
          $count   = $db->createCommand('SELECT COUNT(*) as total FROM ('.$sql.') a')->->queryScalar();
      
          $pagination = new \yii\data\Pagination(['totalCount' => $count, 'pageSize' => $limit]);             
          return $this->render('your-view', [
              'result' => $result,
              'pagination' => $pagination,
          ]);
      

      然后在您的视图中的任何位置:

      echo \yii\widgets\LinkPager::widget([
          'pagination' => $pagination,
      ]);
      

      我自己从E-Avni Tech 的回答中得到了帮助。如果我的回答有帮助,请给他点赞。

      【讨论】:

        猜你喜欢
        • 2015-09-18
        • 1970-01-01
        • 2015-07-07
        • 2017-09-03
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多