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

A way to call `->func()->sum()` without having to declare `$query`

我有什么

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

我想要的

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

我试过的

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

显然这行不通,但您明白了。

我提出这个问题的原因是我看到有人在某个地方这样做:在一个共享的、已经可用的对象上调用 func()。我认为它是 table 对象,但我试过后发现它不起作用。

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

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

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

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

另见