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')