2017-11-02 3 views
1

Ich habe ein seltsames Problem beim Abrufen von Daten aus der Datenbank beim Vergleich von zwei Daten.Laravel/Lumen Beziehung - beitreten andere Tabelle wo Bedingung falsch abrufen

Datenbankstruktur: Benutzer, Reservierungen, reservation_services, services_price_history

Basierend auf den obigen Tabellen: Ein Benutzer viele Vorbehalte hat, haben eine Reservierung zahlreiche Dienstleistungen und ein Service viele Preishistorien hat.

Ich muss alle Benutzer Reservierungen nehmen, dann finden Sie den Service-Preis auf der Grundlage des Buchungsdatums.

Das Problem ist, dass, wenn ich das Datum comparation Zustand hinzufügen wird es nicht berücksichtigt

Der Code:

$users = User::with(['reservations' => function($query) use ($department_id, $date_start, $date_end) { 

    // reservation services 
    $query->with(['reservation_services' => function($query) { 
     $query->join('reservations', 'reservation_services.reservation_id', 'reservations.id'); 
     $query->join('services', 'reservation_services.service_id', 'services.id'); 

     // Find the service price based on reservation date 
     $query->join('services_price_history', function($query) { 
      $query->on('reservations.salon_id', 'services_price_history.salon_id'); 
      $query->on('reservation_services.service_id', 'services_price_history.service_id'); 

      // this shoud be the condition that gives us the correct 
      // price based on the reservation date 
      $query->where('services_price_history.date_start', '<', 'reservations.date'); 
      // then we use order and limit 1 
     }); 

     $query->select(
      'reservation_services.reservation_id', 
      'reservation_services.service_id', 
      'reservation_services.quantity', 
      'services_price_history.price', 
      'services_price_history.date_start', 
      'services.name', 
      DB::raw('(services_price_history.price * reservation_services.quantity) as total') 
     ); 
     $query->orderBy('services_price_history.id', 'desc'); 
    }]); 
}])->get(); 

Dies ist der Ausgang:

[ 
    { 
     "id":10, 
     "first_name":"Mihaela", 
     "last_name":"Radulescu", 
     "reservations":[ 
     { 
      "id":112, 
      "salon_id":2, 
      "client_id":161, 
      "user_id":10, 
      "date":"2017-10-31", // the reservation date 
      "start":"10:00", 
      "end":"12:00", 
      "state_id":5, 
      "notes":null, 
      "price":"350.00", 
      "reservation_services":[ 
       { 
        "reservation_id":112, 
        "service_id":89, 
        "quantity":1, 
        "price":"400.00", 
        "date_start":"2017-11-02", // this is wrong 
        "name":"Tratament ANTI AGE", 
        "total":"400.00" 
       }, 
       { 
        "reservation_id":112, 
        "service_id":89, 
        "quantity":1, 
        "price":"350.00", 
        "date_start":"2017-10-19", // this is ok 
        "name":"Tratament ANTI AGE", 
        "total":"350.00" 
       } 
      ], 
      "reservation_products":[ 

      ] 
     }, 
     ] 
    }, 
], 

I don‘ t weiß wirklich warum, aber diese Zeile auf Code

$query->where('services_price_history.date_start', '<', 'reservations.date');

funktioniert nicht wie es sollte, weil '2017-11-02' höher ist als '2017-10-31', aber es zeigt sich in den Ergebnissen.

Vielen Dank.

Antwort

1

Statt:

$query->where('services_price_history.date_start', '<', 'reservations.date'); 

Verwendung:

$query->whereRaw('services_price_history.date_start < reservations.date'); 
+0

Es ist, als ein Charme! Bitte, kannst du mir erklären warum? Ich sehe keinen Unterschied und bin ein wenig frustriert. Ich danke dir sehr! –

+0

Bei der Verwendung von 'where' war das dritte Argument in diesem Fall der Wert und es wurde automatisch mit PDO-Prepared-Anweisungen gebunden, und bei der Verwendung von' WhereRaw' werden keine vorbereiteten Anweisungen im Code angezeigt, so dass es nun genau so verwendet wird, wie es geschrieben wurde was du brauchst –

+0

vielen Dank. Es macht Sinn. Irgendeine Idee, wie ich das Ergebnis direkt nach $ query-> whereRaw ('services_price_history.date_start limit (1)' oder 'first()' scheint das nicht zu funktionieren. –

Verwandte Themen