/ / Wybór warunkowy Select w elitarnym elemencie - laravel, laravel-4, elokwentny

Wybór warunkowy Select w elitarnym elemencie - laravel, laravel-4, elokwentny

Mam takie surowe zapytanie

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

Teraz mogę przekonwertować to zapytanie w laravel eloquent ORM

Odpowiedzi:

0 dla odpowiedzi № 1
DB::table("users")->select("IF(`user_group` = "1", `total_score`, `score`)")->get();

to zadziała


0 dla odpowiedzi nr 2

Konwertuj zapytanie MYSQL CASE INTO na LARAVEL

$query = DB::raw("(CASE WHEN user_group="1" THEN "Admin" WHEN user_group="2" THEN "User" ELSE "Superadmin" END) as name");

i po prostu wykonaj to zapytanie w

DB::table("tablename")->select($query)->get();

lub

YourModelClass::select($query)->get();

Otrzymasz wynik.


0 dla odpowiedzi № 3

Ma zastosowanie, jeśli musisz mieć dołączenie warunkowe i wybrać:

Korzystanie z natywnych warunków warunkowych mysql może być dobrym sposobem. Możesz być w sytuacji, w której jeśli dany warunek jest prawdziwy w PHP, musisz dołączyć do tej tabeli, w przeciwnym razie nie przyłączaj się.

Na przykład :

Jeśli $ loggedInUser jest administratorem, chcesz uzyskać dostęp do studentów, inaczej pokażą tylko znaki.

możesz mieć (PS poniżej to pseudo-kod tylko w celach informacyjnych):

<?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();

?>

Jeśli spróbujesz zrobić w ten sposób:

<?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
");
?>

Następnie musisz włączyć frekwencję, nawet jeśli wiesz, że warunek jest fałszywy, ponieważ w przeciwnym razie wystąpi błąd "unknown column attendance.total".

Z mojej perspektywy, jeśli wiemy, że nie chcemyw konkretnej kolumnie, po prostu nie przyłączę się do tego stołu. Jeśli wykonasz EXPLAIN na powyższym surowym zapytaniu, zauważysz, że MySQL będzie wymagał tabeli obecności, nawet jeśli warunek If w select jest fałszywy.

Prosimy o komentarz, jeśli uznasz to za nieprawidłowe lub lepsze sugestie.