CakePHP 3 formatResults() 按动态创建的字段排序

CackePHP 3 formatResults() ORDER by field created dynamically

我希望对我在 formatResults()

中动态创建的字段进行排序
$users = $this->Users
->find('all')
->formatResults(function ($users) use ($lat, $lng) {
    return $users->map(function ($user) use ($lat, $lng) {
        $user->distance = getDist($lat, $lng);
        return $user;
    });
})
->order([
    'distance' => 'ASC'
]);

[...]

$this->set('users', $this->paginate($users));

字段 $user->distance 不在数据库中。 $user->distance 包含一个浮点数 (getDist($lat, $lng);),它根据用户在请求时的位置而变化。

->order([
    'distance' => 'ASC'
]);

return 一个错误:Column not found: 1054 Unknown column 'Users.distance' in 'order clause'

我的问题是:我可以对接收到用户信息时动态创建的字段进行排序吗?

您可以按 php 中计算的字段进行排序,但它不适用于分页,因为要进行排序,您需要数据库中的所有记录。您需要创建一个在 SQL 中运行的等效逻辑,以便您可以排序。

检查这个可以帮助您计算距离并按距离排序的插件https://github.com/dereuromark/cakephp-geo/

这是 find('distance') 自定义查找器,您可以在使用提供的行为时将其动态添加到 table。 https://github.com/dereuromark/cakephp-geo/blob/master/src/Model/Behavior/GeocoderBehavior.php#L223