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
我希望对我在 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