一种无需声明$ query即可调用`-> func()-> sum()`的方法

时间:2018-08-23 08:18:17

标签: cakephp query-builder cakephp-3.x

我有什么

$query = $Details->find(); 
$query->select(['sum' => $query->func()->sum('total')]);

source

我想要的

一次调用即可完成所有操作,而无需声明我不会在其他任何地方使用的变量。

我尝试过的

$results = $Details->find('all', [
    'fields' => [
        'sum' => new Cake\ORM\Query()->func()->sum('total'),
    ],
]);
$results = $Details->find('all', [
    'fields' => [
        'sum' => $Details->func()->sum('total'),
    ],
]);

显然那没有用,但是你明白了。

之所以提出这一点,是因为我看到某人确实在这样做:在共享的,已经可用的对象上调用func()。我相信这是表对象,但是一旦尝试了它,它就无法工作。

你们认为这是可能的,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

您不能在表对象上调用func(),没有这样的方法,您必须获取一个查询对象,即$Table->query()->func(),虽然可以正常工作,但这不一定是最好的主意,因为它将是一个新的查询对象,不会考虑为您的find()调用创建的查询对象上发生的可能修改。

tl; dr,使用可调用对象,它将接收当前查询对象作为其第一个参数:

$query = $Details
    ->find()
    ->select(function (\Cake\ORM\Query $query) {
        return [
            'sum' => $query->func()->sum('total')
        ];
    });

另请参见