如何在Laravel中将orderBy()与模型方法一起使用

时间:2018-11-23 00:48:31

标签: laravel laravel-5 eloquent laravel-query-builder

如何使用orderBy通过模型的方法进行订购?

考虑模型用户和方法

public function fullName() {
    return $this->firstName . $this->lastName;
}

我想做类似orderBy('fullName')的事情。这可能吗?我知道我可以使用查询生成器生成等效的代码,但我想保持Model方法不变。

3 个答案:

答案 0 :(得分:0)

我认为您在这里有一些选择:

  1. 在数据库中创建一个视图,该视图的列为fullName。然后更改模型以使用视图。
  2. 创建一个计算列fullName,以便在插入时if将使用firstName和lastName给出的值。
  3. 使用Laravel的Collection类。此类提供了可以使用属性的sortBy方法。

如果使用选项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('*'),我无法使其工作