Laravel sortBy() 基于字符串值

Cam*_*ott 1 php laravel laravel-5

在我的 Laravel 应用程序中,衬衫有多种尺寸:

public function sizes()
{
    return $this->hasMany(\App\Size::class, 'size_id');
}
Run Code Online (Sandbox Code Playgroud)

尺码有一个属性name,可以是 SM、MD、LG、XL、XXL 等。

我想sortBy()在雄辩的关系中添加 a,以便尺寸始终按从 SM 到 XXL 的顺序出现。

是否可以编写基于字符串值的排序?我只是根据一个值是否大于另一个值来编写它们,但这显然不适用于这里。

Maa*_*Dev 5

可以使用以下字符串对结果进行排序case

 public function sizes(){
        return $this->hasMany(\App\Size::class, 'size_id')->orderByRaw(DB::raw("
        CASE name WHEN 'SM' THEN 1
               WHEN 'MD' THEN 2
               WHEN 'LG' THEN 4
               WHEN 'XL' THEN 5
               WHEN 'XXL' THEN 6
     ELSE 7 END ASC"));
    }
Run Code Online (Sandbox Code Playgroud)

还有更短的选项,但它们并不适用于每个数据库实现:

mysql

for find_in_setmysql 看起来像这样:

return $this->hasMany(\App\Size::class, 'size_id')->orderByRaw(DB::raw("find_in_set(name,'SM','MD','LG','XL', 'XXL')"));
Run Code Online (Sandbox Code Playgroud)

玛丽亚数据库

return $this->hasMany(\App\Size::class, 'size_id')->orderByRaw(DB::raw("find_in_set(name,'SM,MD,LG,XL,XXL')"));
Run Code Online (Sandbox Code Playgroud)