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.
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! –
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 –
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. –