【问题标题】:How to use orderBy() with model's method in Laravel如何在 Laravel 中使用 orderBy() 和模型的方法
【发布时间】:2019-04-25 15:22:51
【问题描述】:

如何使用 orderBy 按模型的方法排序?

考虑模型用户和方法

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

我想做一些类似 orderBy('fullName') 的事情。这可能吗?我知道我可以使用 Query Builder 制作等效代码,但我想保持模型方法不变。

【问题讨论】:

  • 简短回答,不,那不可能。 orderBy() 将被翻译成 SQL Order BY 它不知道你的fullname().. 作为最后的手段,你可以考虑using DB::raw() to concat things
  • 所以我将不得不使用 DB:raw() 来重写我所有的方法
  • 很遗憾,或者您可以使用非规范化技巧。创建一个名为fullname 的列,并将它分配给每个模型保存..哦,等等他们有orderByRaw on 5.7 - 可能可以做类似->orderByRaw('CONCAT(firstname, lastname)') 的事情,我可以知道你的Laravel 是什么版本吗?
  • 我使用的是 5.7。我想保留我现有的方法,但似乎我必须使用 DB:raw() 对它们进行编码。
  • 不,你还有那个orderByRaw :(

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


【解决方案1】:

我认为您在这里有几个选择:

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

如果你选择选项 2,首先定义一个属性:

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

然后使用 Laravel 的 Collection:

$items = Model::all()->sortBy('FullName');

注意sortBy 的默认选项是升序,所以如果您希望降序排序:

$items = Model::all()->sortByDesc('FullName');

您可以在此处阅读有关访问器的更多信息:https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor

【讨论】:

  • 我不能使用 sortBy,因为我使用的是分页,而 Collections 没有分页。
【解决方案2】:

我已经用这个解决方案解决了这个问题:

$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 来按模型的附加属性进行排序,这正是我想要做的。所以是的,这是可能的。而且我还可以使用分页。感谢所有试图提供帮助的人。

【讨论】:

    【解决方案3】:
        $personas = Persona::select('*');
        $personas = $personas->addSelect(DB::raw('concat(nombre,\' \',apellido1,\' \',apellido2) as fullname'))
                ->orderBy('fullname', 'ASC')->paginate(K_LINEAS_X_PAGINA);
    

    如果没有 select('*'),我无法让它工作

    【讨论】:

      猜你喜欢
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多