在Eloquent中按照MySQL字段排序

31

当我想在MySQL查询中定义自定义排序顺序时,可以像这样操作:

ORDER BY FIELD(language,'USD','EUR','JPN')

那会是 Eloquent ORM 的版本是什么?

更新:

这是解决方案,它也适用于对各种字段进行排序:

$events = Event::with( 'type', 'location' )
               ->orderBy( 'event_type_id' )
               ->orderByRaw( "FIELD(status, 'good', 'bad', 'hidden', 'active', 'cancelled')" )
               ->orderBy( 'date' );

1
你尝试过 $query->orderBy("FIELD(language,'USD','EUR','JPN')", 'asc'); 吗? - Alex
是的,但这会导致“未知字段”错误。 - wout
3个回答

49

可以直接使用DB::raw()orderByRaw来排序:

$models = Model::orderByRaw('FIELD(language, "USD", "EUR", "JPN")')->get();
// or
$models = Model::orderBy(DB::raw('FIELD(language, "USD", "EUR", "JPN")'))->get();

除了原始订单查询外,我还按其他字段排序。所以现在我得到了这个错误:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法中有一个错误;请检查与您的MySQL服务器版本相对应的手册以使用正确的语法'asc'(SQL:select * from `events` where `events`.`deleted_at` is null and `status` = 'good' order by `event_type_id` asc, FIELD(status, 'good', 'bad', 'hidden', 'active', 'cancelled', `date` asc) - wout
看起来你把 asc 放在了括号里。 - lukasgeiter
我更新了初始问题,包括Eloquent语法。 - wout
抱歉,我的错。看起来我忘记加上右括号了。谢谢你的答案。现在它可以工作了。 - wout
这是限制结果还是仅仅排序?如果我按照某个东西排序 - 比如一个id,然后我按2、5、7排序 - 那么其他具有不同id的行会发生什么? - alex toader
显示剩余2条评论

10

在 FIELD() 的第二个参数中使用 implode

 $facilities = $query->with(['interest','city:id,name', 'state:id,name'])
        ->Active()
        ->whereIn('facility_id', $facilities_list)
        ->orderByRaw('FIELD(facility_id, '.implode(", " , $facilities_list).')')
        ->get();

1
如果您使用join,只需在列名之前添加表名即可。
Student::orderByRaw('FIELD(students.id, 3, 2, 1) DESC')->join('students_contact', 'students_contact.student_id', '=', 'students.id')
->get();

注意: 在原始查询中添加一个列,该列在右侧,让我举个例子来解释 如果您想实现订单7、8、9。
orderByRaw('FIELD(students.id, 9, 8, 7) DESC')

然后它将以正确的方式获取数据。 我还添加了 DESC 关键字,因为它会在列表底部添加排序后的数据,而不是在列表开头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接