laravel雄辩的条件选择语句

时间:2014-09-16 09:25:40

标签: laravel laravel-4 eloquent

我有像这样的原始查询

SELECT IF(`user_group` = '1', `total_score`, `score`) FROM `user`

现在我可以在laravel eloquent ORM

中转换此查询

3 个答案:

答案 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需要考勤表。

如果您发现此错误或更好的建议,请随时发表评论。