Php Laravel 5:如何为集合创建自定义属性,然后使用它进行排序

Php Laravel 5:如何为集合创建自定义属性,然后使用它进行排序,php,sql,laravel,laravel-5,eloquent,Php,Sql,Laravel,Laravel 5,Eloquent,我想对模型的结果进行复杂的排序 例如,我有\App\Classes::where(something),从那里我想为每个类添加一个附加属性,然后使用该属性进行排序,即(受中方法的启发) 但是这个代码给了我 SQL错误:“未找到列:'order子句'中的1054未知列'custom_score'” 我不想为这个自定义的_分数实际写入数据库,因为它会随着每个用户的交互而经常和唯一地改变 什么是好的解决方案 提前非常感谢。使用收集方法: $collection->transform(functi

我想对模型的结果进行复杂的排序

例如,我有
\App\Classes::where(something)
,从那里我想为每个类添加一个附加属性,然后使用该属性进行排序,即(受中方法的启发)

但是这个代码给了我

SQL错误:“未找到列:'order子句'中的1054未知列'custom_score'”

我不想为这个自定义的_分数实际写入数据库,因为它会随着每个用户的交互而经常和唯一地改变

什么是好的解决方案

提前非常感谢。

使用收集方法:

$collection->transform(function($i) {
    $i->custom_score = // Some logic here
    return $i;
});
您可以在您的模型上添加,如:

public function getCustomScoreAttribute() {
       // return some logic per 
}
这使得您的模型可以访问
自定义评分。

使用收集方法:

$classes = \App\Classes::where(something)->get();
foreach ($classes as &$class) {
    $classes->custom_score = some logic that changes per $class;
}
$classes_sorted = $classes->sortBy('custom_score')
为每个类附加一个附加属性

但是在您的代码中,您将值附加到
$classes
。将值添加到
$class

$classes = \App\Classes::where(something)->get();

foreach ($classes as &$class) {
    $class['custom_score'] = some logic that changes per $class;
}
另外,a没有
orderBy
方法,您需要使用
sortBy()


谢谢Alexey,这离我想要实现的目标非常接近。因此,据我所知,我需要它以集合格式运行(即$collection=\App\Classes::where(x)->get(),然后应用代码)。但是,之后我想对结果进行分页(即$collection->paginate(20)),但我不能这样做,因为我认为分页只在模型上直接起作用,而不是在集合上(即,我得到的是“方法paginate不存在。”错误)。有什么建议吗?谢谢again@user6122500你可以。您将在何处以及如何使用附加属性?我将使用此“自定义分数”转到orderBy或sortByDesc$classes,然后在视图中显示已排序的$classes(基本上是目录页面)
$classes = \App\Classes::where(something)->get();

foreach ($classes as &$class) {
    $class['custom_score'] = some logic that changes per $class;
}
$classes_sorted = $classes->sortBy('custom_score')