我有像这样的原始查询
SELECT IF(`user_group` = '1', `total_score`, `score`) FROM `user`
现在我可以在laravel
eloquent
ORM
答案 0 :(得分:3)
将MYSQL CASE转换为LARAVEL查询
$query = DB::raw("(CASE WHEN user_group='1' THEN 'Admin' WHEN user_group='2' THEN 'User' ELSE 'Superadmin' END) as name");
并在
中执行此查询DB::table('tablename')->select($query)->get();
或
YourModelClass::select($query)->get();
你会得到结果。
答案 1 :(得分:0)
DB::table('users')->select('IF(`user_group` = '1', `total_score`, `score`)')->get();
这将起作用
答案 2 :(得分:0)
如果您需要有条件加入并选择:
,则适用使用mysql的原生条件可能是一个好方法。您可能处于这样的情况:如果某个特定条件在PHP中是真实的,那么您需要加入该表,否则不要加入。
例如:
如果$ loggedInUser是admin,那么你想让学生注意,否则只是显示标记。
你可以拥有(PS下面是一个伪代码仅供参考):
<?php
// Having the column selection only when a particular condition is true
// Else have its value as NULL(You can have NA also)
if($loggedInUser->role == 'admin'){
$attendanceColumnSelect = DB::raw('attendance.total as total_attendance');
}
else{
$attendanceColumnSelect = DB::raw('NULL as total_attendance');
}
// Students query with joins which must be there always
$studentsQuery= Students::select('name', 'class', 'age', $attendanceColumnSelect)
->join('someothertable', 'someothertable.student_id', '=', 'student.id');
// Adding join of attendance only when required for admin role
if($loggedInUser->role == 'admin'){
$studentsQuery->join('attendance', 'attendance.student_id', '=', 'student.id');
}
// Getting final data
$finalResult = $studentsQuery->get();
?>
如果您尝试这样做:
<?php
$finalResult = DB::select("
SELECT students.name,
students.class,
students.age,
IF('$loggedInUser->role' = 'admin', attendance.total, NULL) as total_attendance
FROM students
INNER JOIN someothertable on someothertable.student_id = student.id
INNER JOIN attendance on attendance.student_id = student.id
");
?>
然后,即使您知道条件是错误的,您也必须加入出席,否则它将有未知的列出勤率。总计&#39;错误。
从我的角度来看,如果我们知道我们不想要一个特定的列,我就不会加入该表。如果对上面的原始查询执行EXPLAIN,即使select中的If条件为false,也会发现MySQL需要考勤表。
如果您发现此错误或更好的建议,请随时发表评论。