简体   繁体   中英

Custom pagination query error in CakePHP

I am new in CakePHP. Now, I am using cakephp (version 2.8.5).

I try to create custom query pagination because I need to join multiple tables. But, its not work and I got Unsupported operand types error.

In my User model, I try to create paginate() and paginateCount() function as shown in below.

    public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {

            $recursive = -1;

            // // Mandatory to have
            // $this->useTable = false;
            $sql = '';

            $sql .= "SELECT u.id,u.name, u.password, r.display_name, GROUP_CONCAT(p.display_name SEPARATOR ', ') as per_name ";
            $sql .= "FROM `users` u ";
            $sql .= "LEFT JOIN roles r ON (u.role_id = r.id) ";
            $sql .= "LEFT JOIN user_permission up ON (u.id = up.user_id) ";
            $sql .= "LEFT JOIN permissions p ON (up.permission = p.id) ";
            $sql .= "WHERE 1 GROUP BY u.name ORDER BY u.id ";
            // Adding LIMIT Clause
            $sql .= "LIMIT ".(($page - 1) * $limit) . ', ' . $limit;

            $results = $this->query($sql);

            return $results;
        }

        public function paginateCount($conditions = null, $recursive = 0,
            $extra = array()) {

            $sql = '';

            $sql .= "SELECT COUNT(*) as count FROM
                (SELECT u.id,u.name, u.password, r.display_name, GROUP_CONCAT(p.display_name SEPARATOR ', ') as per_name
                FROM `users` u 
                LEFT JOIN roles r ON (u.role_id = r.id) LEFT JOIN user_permission up ON (u.id = up.user_id) 
                LEFT JOIN permissions p ON (up.permission = p.id) 
                WHERE 1 
                GROUP BY u.name
                ORDER BY u.id ) AS Temp";

            $this->recursive = $recursive;

            $results = $this->query($sql);

            return $results;
        }

In my UsersController ,

    public function index() {

        $users = $this->User->getAllUser();

        //for pagination
        $this->paginate = array(
            'limit' => 4
        );
        $page = $this->paginate();
        $count = $this->paginateCount();

        $this->set('page',$page);
        $this->set('rowCount',$count);
        $this->set('users',$users);
        $this->render('index');

    }

But its not work and I got Unsupported operand types fatal error. I think may be I was wrong in here( $this->paginate() ). But actually not sure what is wrong in my code.

I already searching a lot of place on web and can't solve. I'm very appreciate for any suggestion.

Ok, now I understand what's wrong in my code.

Problem is not in controller. I was wrong when I return $results in paginateCount() function. The correct way to returning the result must be like return $results[0][0]['count']; in the paginateCount() function.

Because the query result in paginateCount() will return like this:

array(1) { [0]=> array(1) { [0]=> array(1) { ["count"]=> string(1) "5" } } }

Complete code for paginateCount() is as shown in below.

    public function paginateCount($conditions = null, $recursive = 0,
            $extra = array()) {

            $sql = '';

            $sql = "SELECT COUNT(*) as count FROM
                (SELECT User.id,User.name, User.password, r.display_name, GROUP_CONCAT(p.display_name SEPARATOR ', ') as per_name
                FROM `users` User 
                LEFT JOIN roles r ON (User.role_id = r.id) LEFT JOIN user_permission up ON (User.id = up.user_id) 
                LEFT JOIN permissions p ON (up.permission = p.id) 
                WHERE 1 
                GROUP BY User.name
                ORDER BY User.id ) AS Temp";

            $this->recursive = $recursive;

            $results = $this->query($sql);
            return $results[0][0]['count'];
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM