CackePHP 3 formatResults()按动态创建的字段进行ORDER

时间:2015-06-22 07:42:50

标签: cakephp-3.0

我希望对我在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'
]);

返回错误:Column not found: 1054 Unknown column 'Users.distance' in 'order clause'

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

1 个答案:

答案 0 :(得分:1)

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

检查此插件,它可以帮助您计算距离并按他们排序https://github.com/dereuromark/cakephp-geo/

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