我正在尝试学习cakephp 3和ORM功能,到目前为止它很棒。但是知道我正在谈论我不确定如何以最好的方式接受它,所以我希望有人能说出最好的方法。
我正在使用查询构建器来加载一个或多个产品。在加载的数据中,我有一个名为price的字段。这是产品的主要价格,但用户可以选择折扣。我知道用户已经登录到系统,所以我有一个包含他的折扣的varbele,例如1.20(= 20%)。
在查询被触发后,我可以做一个foreach并在发送到视图之前重新计算价格,但由于查询构建器功能,我怀疑在解雇查询之前我可以在那里执行。
下面是对输入名称进行搜索的示例。现场价格现在是标准价格,但应该用折扣重新计算。这可能是一个游艇示例:
$price = round((($price/$User->discount)-$shipping),2);
SearchController:
public function search()
{
if ($this->request->is('post')) {
//$this->request->data);
$options = array();
$options['query'] = $this->request->data['Search']['query'];
$products = TableRegistry::get('Products');
$query = $products->find('search', $options);
$number = $query->count();
$products = $query->All();
$this->set(compact('products'));
$this->set('number_of_results',$number);
}
产品表:
public function findSearch(Query $query, array $options)
{
$query
->where([
'name LIKE' => '%'.$options['query'].'%',
"active" => 1
])
->contain(['ProductsImages'])
->select(['id','name','price','delivery_time','ProductsImages.image_url'])
;
return $query;
}
有没有办法在查询构建器中实现此重新计算?我试图在网上找到一些信息,但关于ORM选项的信息还不多。我想的可能是 - >结合。希望有人想让我朝着正确的方向前进。
先谢谢。
将控制器功能更改为:
public function search()
{
if ($this->request->is('post')) {
$options = array();
$options['query'] = $this->request->data['Search']['query'];
$discount = 2;
$products = TableRegistry::get('Products');
$query = $products
->find('search', $options);
$query->formatResults(function (\Cake\Datasource\ResultSetInterface $products) {
return $products->map(function ($row) {
$row['price'] = ($row['price'] + 10);
return $row;
});
});
$number = $query->count();
$products = $query->All();
$this->set(compact('products'));
$this->set('number_of_results',$number);
}
}