在CakePHP中动态创建虚拟字段
我希望动态创建虚拟字段 我的订单和订单详细信息如下在CakePHP中动态创建虚拟字段,cakephp,cakephp-2.3,Cakephp,Cakephp 2.3,我希望动态创建虚拟字段 我的订单和订单详细信息如下 //Order Model class Order extends AppModel { public $name = 'Order'; public $actsAs = array('Containable'); public $hasMany = array( 'OrderDetail' => array( 'className' => 'OrderDetail',
//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
),
);
}
模型关系是这样的。我正在动态创建虚拟字段,以便在分页时计算项目数量及其成本。我知道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'));
它以“字段列表”中的mysql未找到列
未知列“OrderDetail.order\u id”结束。
。我没有把递归或绑定我的模型来寻找其他东西。为什么会产生此错误?如何实现我的目标。您可以动态创建虚拟字段。您的语法是正确的,但也可以这样做:
$this->Order->virtualFields['totalCost'] = 'SUM(`OrderDetail`.`cost`)';
$this->Order->virtualFields['totalItem'] = 'COUNT(`OrderDetail`.`order_id`)';
这里的问题是,订单与OrderDetail有很多关系。在本例中,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')
);
您可以使用以下方法使用cakephp动态创建虚拟字段:
class User extends AppModel {
public $virtualFields = array(
'full_name' => 'CONCAT(User.first_name, " ",User.last_name)'
);
}
此处全名是动态的虚拟字段,它使用名字和姓氏生成用户的全名。强制cake通过使用
'joins'=>数组(…)
执行单个查询。这不在飞行中。我如何在Cakephp3上执行此操作?请提供帮助?请参阅实体级别的Cake3+(无需SQL)。对于SQL,请将记录的虚拟字段用作SQL表达式:。