如何使用orderBy通过模型的方法进行订购?
考虑模型用户和方法
public function fullName() {
return $this->firstName . $this->lastName;
}
我想做类似orderBy('fullName')的事情。这可能吗?我知道我可以使用查询生成器生成等效的代码,但我想保持Model方法不变。
答案 0 :(得分:0)
我认为您在这里有一些选择:
fullName
。然后更改模型以使用视图。如果使用选项2,请首先定义一个属性:
public function getFullNameAttribute()
{
return $this->firstName . $this->lastName;
}
然后使用Laravel的收藏集:
$items = Model::all()->sortBy('FullName');
注意:sortBy
的默认选项是升序,因此,如果您希望以降序排列:
$items = Model::all()->sortByDesc('FullName');
您可以在此处了解有关访问器的更多信息:https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor
答案 1 :(得分:0)
我已经通过以下解决方案解决了这个问题:
$sorted = User::get()
->sortBy('full_name') //appended attribute
->pluck('id')
->toArray();
$orderedIds = implode(',', $sorted);
$result = DB::table('user')
->orderByRaw(\DB::raw("FIELD(id, ".$orderedIds." )"))
->paginate(10);
我已将fullName属性附加到模型中,以供sortBy使用。 通过此解决方案,我能够使用orderBy对模型的附加属性进行排序,而这正是我想要做的。是的,这是可能的。而且我也可以使用分页。感谢所有尝试提供帮助的人。
答案 2 :(得分:0)
$personas = Persona::select('*');
$personas = $personas->addSelect(DB::raw('concat(nombre,\' \',apellido1,\' \',apellido2) as fullname'))
->orderBy('fullname', 'ASC')->paginate(K_LINEAS_X_PAGINA);
没有select('*'),我无法使其工作