在CakePHP中动态创建虚拟字段

San*_*alp 4 cakephp cakephp-2.3

我希望动态创建虚拟字段.

我的订单和订单详情如下......

//Order Model
class Order extends AppModel {
    public $name = 'Order';
    public $actsAs = array('Containable');
    public $hasMany = array(
        'OrderDetail' => array(
            'className' => 'OrderDetail',
            'foreignKey' => 'order_id',
            'dependent' => true
        ),
    );
}

//OrderDetail Model
  class OrderDetail extends AppModel {
    public $name = 'OrderDetail';
    public $actsAs = array('Containable');
    public $belongsTo = array(
        'Order' => array(
            'className' => 'Order',
            'foreignKey' => 'order_id',
            'dependent' => true
        ),
    );
}
Run Code Online (Sandbox Code Playgroud)

模型关系是这样的.我正在动态创建虚拟字段,以便我可以按照分页计算项目数量和成本.我知道这种奇怪的方式requestAction.是他们的任何其他方式我可以完成我的任务.

我试过的代码是

        $this->Order->virtualFields['totalCost'] = 0;
        $this->Order->virtualFields['totalItem'] = 0;
        $fields = array('Order.id', 'Order.order_key', 'Order.delivery_date','COUNT(`OrderDetail`.`order_id`) AS `Order__totalItem`', 'SUM(`OrderDetail`.`cost`) AS `Order__totalCost`');         

        $this->paginate['Order'] = array("fields"=>$fields, 'conditions' => array("AND" => array($condition, "Order.status" => 3)), 'limit' => '50', 'order' => array('Order.id' => 'DESC'));
Run Code Online (Sandbox Code Playgroud)

它以mysql not found列结束了我Unknown column 'OrderDetail.order_id' in 'field list'.我没有放置递归或绑定我的模型来找到别的东西.为什么会产生这个错误?我怎样才能实现我的目标.

ari*_*lia 14

您可以动态创建虚拟字段.你的语法是正确的,但你也可以这样做:

$this->Order->virtualFields['totalCost'] = 'SUM(`OrderDetail`.`cost`)';
$this->Order->virtualFields['totalItem'] = 'COUNT(`OrderDetail`.`order_id`)';
Run Code Online (Sandbox Code Playgroud)

这里的问题是Order与OrderDetail处于HasMany关系.在这种情况下,CakePHP不会连接表,而是进行两个查询,一个用于Orders,一个用于OrderDetail,然后合并记录集.

你能做什么?

您可以对OrderDetail进行分页而不是Order,并按Order.id对其进行分组

$fields = array
(
    'Order.id', 
    'Order.order_key', 
    'Order.delivery_date', 
    'Order.totalItem', 
    'Order.totalCost'
);         

$this->paginate['OrderDetail'] = array
(
    "fields"=> $fields, 
    'conditions' => array("AND" => array($condition, "Order.status" => 3)), 
    'limit' => '50', 
    'order' => array('Order.id' => 'DESC'),
    'group' => array('Order.id')
);
Run Code Online (Sandbox Code Playgroud)