CakePHP - 连接表后的Paginate数据

时间:2015-04-17 09:55:00

标签: mysql cakephp pagination

我遇到了从连接2个表中分页数据的问题。在我的数据库中,我有两个表:

产品:

  • PRODUCT_ID
  • PRODUCT_NAME

价格:

  • PRODUCT_ID
  • PRODUCT_PRICE

2个表之间的关系是,产品可以有许多不同的价格(在许多商店中)。我想显示产品清单,并以最便宜的价格订购。所以,这就是我到目前为止所做的:

        $this->paginate = array(
            'joins' => array(
                    array(
                            'table' => 'price',
                            'alias' => 'Price',
                            'conditions' => array(
                                    'Product.product_id = Price.product_id'
                            )
                    )
            ),
            'fields' => array(
                    'Product.product_id',
                    'Product.product_name',
                    'MIN(Prices.product_price) AS min_price'
            ),
            'order' => array('min_price' => 'ASC'),
            'limit' => 10,
            'group' => 'Product.product_id'
        );

以下是加入后返回的数据:

[Product] => Array
       (
            [product_id] => 1
            [product_name] => iPhone 6 Plus 64GB
       )

[0] => Array
       (
            [min_price] => 20290000
       )

但是新字段'min_price'无法对列表进行排序。它按id排序。如果我将'order'参数更改为'product_name',则分页有效......

1 个答案:

答案 0 :(得分:0)

在执行查找之前,使用虚拟字段将min_price定义为MIN(Prices.product_price)(如所述here

$this->Product->virtualFields['min_price'] = 'MIN(Prices.product_price)';

然后将find的字段数组简化为:

    $this->paginate = array(
        'joins' => array(
                array(
                        'table' => 'price',
                        'alias' => 'Price',
                        'conditions' => array(
                                'Product.product_id = Price.product_id'
                        )
                )
        ),
        'fields' => array(
                'Product.product_id',
                'Product.product_name',
                'min_price'
        ),
        'order' => array('min_price' => 'ASC'),
        'limit' => 10,
        'group' => 'Product.product_id'
    );