2017-07-08 1 views
1

gibt es eine Möglichkeit, diese Abfragen kürzer oder einfacher? oder vielleicht das Ergebnis in 1 Abfrage statt 3. ?? jede Beratung geschätztMachen Sie SQL Abfrage einfacher kürzer (Laravel)

 $room_single = \DB::table('book_room') 
     ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
     ->where('tourdateID', '=', $id) 
     ->where('roomtype','=',1) 
     ->where('book_room.status','=',1) 
     ->count(); 

    $room_double = \DB::table('book_room') 
     ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
     ->where('tourdateID', '=', $id) 
     ->where('roomtype','=',2) 
     ->where('book_room.status','=',1) 
     ->count(); 

    $room_triple = \DB::table('book_room') 
     ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
     ->where('tourdateID', '=', $id) 
     ->where('roomtype','=',3) 
     ->where('book_room.status','=',1) 
     ->count(); 
    $total= $room_single+($room_double*2)+($room_triple*3) ; 
+0

Was versuchen Sie zu tun? Kannst du bitte erklären. Wenn Sie nur gebuchtes Zimmer zählen möchten, können Sie es auf andere Weise tun. –

+0

Hallo Sagar .. ich versuche, die gebuchten Zimmer zu zählen .. Ich brauche die Anzahl der Einzel-, Doppel-und Dreibettzimmer. Insgesamt ist die Gesamtzahl der Passagiere .. Es funktioniert alles ohne Probleme. Ich habe mich nur gefragt, ob es eine elegantere Art und Weise als das, was ich tat – stoneshak

+1

Ich habe das versucht. Ich habe die Logik. Aus irgendeinem Grund zählt es nur das Einzelzimmer. Es zählt nicht die Doppel- oder Dreibettzimmer. Ich werde es herausfinden, aber .. Ich wählte den ersten Weg. – stoneshak

Antwort

1

In diesem Fall, da die roomtype Spalte direkt bezieht sich, wie Sie die Gesamt berechnen würden Sie nur sum statt count verwenden:

$total = \DB::table('book_room') 
    ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
    ->where('tourdateID', '=', $id) 
    ->where('book_room.status', '=', 1) 
    ->sum('roomtype'); 

UPDATE

Wenn Sie noch die Zählung brauchen für jede roomtype dann könnten Sie etwas tun wie:

$query = \DB::table('book_room') 
    ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
    ->where('tourdateID', '=', $id) 
    ->where('book_room.status', '=', 1); 

$room_single = $query->newQuery()->where('roomtype', 1)->count(); 
$room_double = $query->newQuery()->where('roomtype', 2)->count(); 
$room_triple = $query->newQuery()->where('roomtype', 3)->count(); 
$total = $room_single + ($room_double * 2) + ($room_triple * 3); 

Die Verwendung von newQuery bedeutet, dass Sie Beschränkungen wiederverwenden können, ohne das Original hinzuzufügen.


Oder wenn Sie nicht möchten, mehrere Abfragen und Sie wollen php zu handhaben die Zählungen

$rooms = \DB::table('book_room') 
    ->select('roomtype') 
    ->selectRaw('count(*) as room_count') 
    ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
    ->where('tourdateID', '=', $id) 
    ->where('book_room.status', '=', 1) 
    ->whereBetween('roomtype', [1, 3])//This is only needed if you have other room types 
    ->groupBy('roomtype') 
    ->orderBy('roomtype') 
    ->get('roomtype'); 

list($room_single, $room_double, $room_triple) = $rooms->pluck('room_count')->toArray(); 
$total = $rooms->sum(function ($item) { 
    return $item->room_count * $item->roomtype; 
}); 

hoffe, das hilft machen!

+0

sowie $ total, ich brauche auch $ room_single, $ room_double, room_triple .. gibt es einen einfachen Weg mit Ihrer Anfrage? – stoneshak

+0

@stoneshak Ich habe meine Antwort mit einigen weiteren Möglichkeiten aktualisiert. –

+0

Vielen Dank. Es ist großartig. nett und einfach. Würde es Ihnen etwas ausmachen, auch diese Frage zu betrachten? https://stackoverflow.com/questions/44808189/how-to-get-the-record-if-count-is-zero-in-laravel – stoneshak

0

Ich habe genug Beiträge nicht, dass deshalb als Antwort ist Entsendung. versuchen

GROUP BY roomtype 

Dann werden Sie nicht Ihre Zimmertyp ändern müssen.

0

Sie können es auf einfachere Weise tun.

ist,

$query = \DB::table('book_room') 
     ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
     ->where('tourdateID', '=', $id) 
     ->where('book_room.status','=',1); 

$room_single = $query->where('roomtype','=',1)->count(); 
$room_double = $query->where('roomtype','=',2)->count(); 
$room_triple = $query->where('roomtype','=',3)->count(); 

Und dann diese hinzufügen, wie Sie möchten. Dies reduziert nur Ihre Codezeilen.

Ein anderer und besserer Weg folgt.

$all_type = \DB::table('book_room') 
      ->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID') 
      ->where('tourdateID', '=', $id) 
      ->where('book_room.status','=',1) 
      ->select('roomtype',\DB::raw('COUNT(bookingID) as count')) 
      ->groupBy('roomtype') 
      ->get(); 

Mit dieser Abfrage erhalten Sie drei Zähler für jeden Zimmertyp. Ich hoffe, Sie verstehen.

+0

Ihr erstes Beispiel würde nur für die Abfrage '$ room_single' funktionieren, da die folgenden Abfragen weiterhin die Ursachen für die vorherigen Abfragen enthalten würden. –

+1

danke. Deshalb konnte ich es nicht zur Arbeit bringen.Lass mich deine versuchen – stoneshak

+0

@stoneshak okay, viel Glück –