2016-04-20 2 views
0

Ich verwende folgende Abfrage, um Datensatz aus der Datenbank abzurufen. Es hat sich mit vielen anderen Tabellen verbunden. Alles funktioniert gut, aber Problem ist, ich bekomme mehrere Zeilen der gleichen Reservierung und es ist, weil Buchung Tabelle mit Zahlungstabelle und Zahlungstabelle hat mehrere Zeilen gegen eine Reservierung, weshalb es komplette Datensatz wiederholen. Was ich will, ist eine Zeile mit allen Zahlungszeilen anzuzeigen, so dass ich alle Zahlungen durchlaufen und sie anzeigen kann, anstatt den gesamten Reservierungsdatensatz immer wieder anzuzeigen. unten ist meine Abfrage. Es ist Laravel 5.2.Mehrere Zeilen der gleichen Zeile mit nur einer Spalte erhalten Änderung von der Datenbank

return $results = DB::table('resorts_reservation') 
      ->join('resorts_resort', 'resorts_reservation.resortId', '=', 'resorts_resort.resortId') 
      ->join('resorts_roomtype', 'resorts_reservation.roomTypeId', '=', 'resorts_roomtype.roomTypeId') 
      ->join('resorts_customer', 'resorts_reservation.customerId', '=', 'resorts_customer.customerId') 
      ->join('resorts_salesperson', 'resorts_reservation.salesPersonId', '=', 'resorts_salesperson.salesPersonId') 
      ->join('resorts_payment', 'resorts_reservation.reservationId', '=', 'resorts_payment.reservationId') 
      ->join('resorts_paymentmethod', 'resorts_payment.paymentMethodId', '=', 'resorts_paymentmethod.paymentMethodId') 
      ->join('resorts_emailnotification', 'resorts_reservation.reservationId', '=', 'resorts_emailnotification.reservationId') 
      ->join('resorts_resortcompany', 'resorts_resort.resortCompanyId', '=', 'resorts_resortcompany.resortCompanyId') 
      ->select('resorts_reservation.totalAmount', 'resorts_reservation.saleDate', 'resorts_reservation.reservationId', 
        'resorts_reservation.confirmNo', 'resorts_reservation.numberOfNights', 'resorts_reservation.checkInDate', 
        'resorts_reservation.checkOutDate', 'resorts_reservation.numberOfAdults', 'resorts_reservation.numberOfChildren', 
        'resorts_reservation.totalInParty', 'resorts_reservation.notes', 'resorts_reservation.totalPrice', 
        'resorts_reservation.saleSource', 'resorts_reservation.depositAmount', 'resorts_reservation.confirmationSent', 
        'resorts_reservation.finalized', 
        'resorts_customer.firstName', 'resorts_customer.mobilePhone', 'resorts_customer.otherPhone', 
        'resorts_customer.email', 'resorts_customer.addressLineOne', 'resorts_customer.city', 
        'resorts_customer.country', 'resorts_customer.state_', 'resorts_customer.postalCode', 
        'resorts_resort.resortName', 
        'resorts_roomtype.roomTypeDesc', 'resorts_roomtype.occupancy', 
        'resorts_salesperson.firstName as saleFirstName','resorts_salesperson.lastName as saleLastName', 
        'resorts_paymentmethod.methodType', 
        'resorts_payment.transactionNo', 
        'resorts_resortcompany.resortCompanyName') 
      ->whereRaw($where) 
      ->orderBy('reservationId', 'desc') 
      ->get(); 

Unten ist die Ergebnisrückgabe aus der Abfrage. Sie können sehen, dass beide Zeilen denselben Datensatz mit nur "transactionNo" Spaltenänderung haben.

[0] => stdClass Object 
    (
     [totalAmount] => 2161.2 
     [saleDate] => 2016-03-09 00:00:00 
     [reservationId] => 30286 
     [confirmNo] => 
     [numberOfNights] => 3 
     [checkInDate] => 2016-04-22 00:00:00 
     [checkOutDate] => 2016-04-25 00:00:00 
     [numberOfAdults] => 6 
     [numberOfChildren] => 0 
     [totalInParty] => 6 
     [notes] => 
     [totalPrice] => 2161.2 
     [saleSource] => VRBO 
     [depositAmount] => 2161.2 
     [confirmationSent] => 0 
     [finalized] => 0 
     [firstName] => Michael 
     [mobilePhone] => 505-321-2106 
     [otherPhone] => 
     [email] => [email protected] 
     [addressLineOne] => 
     [city] => Albuquerque 
     [country] => USA 
     [state_] => NM 
     [postalCode] => 87111 
     [resortName] => San Francisco - Canterbury 
     [roomTypeDesc] => 3 Bedroom Presidential 
     [occupancy] => 6 
     [saleFirstName] => Kristy 
     [saleLastName] => Conlin 
     [methodType] => CREDIT_CARD 
     [transactionNo] => 7MG983973K453254C 

     [resortCompanyName] => Wyndham 
    ) 

[1] => stdClass Object 
    (
     [totalAmount] => 2161.2 
     [saleDate] => 2016-03-09 00:00:00 
     [reservationId] => 30286 
     [confirmNo] => 
     [numberOfNights] => 3 
     [checkInDate] => 2016-04-22 00:00:00 
     [checkOutDate] => 2016-04-25 00:00:00 
     [numberOfAdults] => 6 
     [numberOfChildren] => 0 
     [totalInParty] => 6 
     [notes] => 
     [totalPrice] => 2161.2 
     [saleSource] => VRBO 
     [depositAmount] => 2161.2 
     [confirmationSent] => 0 
     [finalized] => 0 
     [firstName] => Michael 
     [mobilePhone] => 505-321-2106 
     [otherPhone] => 
     [email] => [email protected] 
     [addressLineOne] => 
     [city] => Albuquerque 
     [country] => USA 
     [state_] => NM 
     [postalCode] => 87111 
     [resortName] => San Francisco - Canterbury 
     [roomTypeDesc] => 3 Bedroom Presidential 
     [occupancy] => 6 
     [saleFirstName] => Kristy 
     [saleLastName] => Conlin 
     [methodType] => CREDIT_CARD 
     [transactionNo] => 
     [resortCompanyName] => Wyndham 
    ) 

Was ich will, ist so etwas wie unten:

[0] => stdClass Object 
    (
     [totalAmount] => 2161.2 
     [saleDate] => 2016-03-09 00:00:00 
     [reservationId] => 30286 
     [confirmNo] => 
     [numberOfNights] => 3 
     [checkInDate] => 2016-04-22 00:00:00 
     [checkOutDate] => 2016-04-25 00:00:00 
     [numberOfAdults] => 6 
     [numberOfChildren] => 0 
     [totalInParty] => 6 
     [notes] => 
     [totalPrice] => 2161.2 
     [saleSource] => VRBO 
     [depositAmount] => 2161.2 
     [confirmationSent] => 0 
     [finalized] => 0 
     [firstName] => Michael 
     [mobilePhone] => 505-321-2106 
     [otherPhone] => 
     [email] => [email protected] 
     [addressLineOne] => 
     [city] => Albuquerque 
     [country] => USA 
     [state_] => NM 
     [postalCode] => 87111 
     [resortName] => San Francisco - Canterbury 
     [roomTypeDesc] => 3 Bedroom Presidential 
     [occupancy] => 6 
     [saleFirstName] => Kristy 
     [saleLastName] => Conlin 
     [methodType] => CREDIT_CARD 
     array(
      [transactionNo] => 7MG983973K453254C 
      [transactionNo] => 
     ) 
     [resortCompanyName] => Wyndham 
    ) 
+0

Wenn Sie nur eine Reservierung anzeigen möchten, können Sie GROUPBY ("reservationId"). Wenn Sie alle Zahlungen für eine Reservierung separat anzeigen möchten, würde ich eine andere Abfrage nur für Zahlungen erstellen und die Zahlungs-ID/transactionNo anzeigen. Nicht sicher, was Sie meinen: "zeigen Sie eine Zeile mit allen Zahlungen Zeilen drin" vielleicht können Sie näher darauf eingehen. – Tom

+0

#Tom Ich habe meine Frage aktualisiert. Ich möchte eine Zeile gegen eine Reservierung, aber diese Zeile sollte mehrere Zahlungszeilen haben, wie die, die ich in der aktualisierten Frage hinzugefügt habe. Durch diese Handhabung wird es einfacher in der Steuerung oder Ansicht. –

+0

Ok, jetzt macht es Sinn. Ich habe unten eine Antwort geschrieben, schau sie dir an. – Tom

Antwort

0

Sie können GROUP-CONCAT Funktion Gruppe alle Zahlungstransaktionsnummern für jede Reservierung verwenden.

Von MySQL docs

Diese Funktion gibt ein String Ergebnis mit den verketteten Nicht-NULL Werten aus einer Gruppe. Es gibt NULL zurück, wenn keine Nicht-NULL-Werte vorhanden sind.

Ihre Anfrage wird wie folgt aussehen:

SELECT resorts_reservation.totalAmount, ..., GROUP_CONCAT(resorts_payment.transactionNo separator ', ') as transactionNoList 
WHERE... 

Hoffnung macht das Sinn, wenn nicht, werde ich froh sein, zu klären.

Tom Rushman

+0

Verwendet dies, aber jetzt gibt es nur eine Zeile mit allen Zahlung transactionNo in es durch "," getrennt. Ich möchte, dass meine Anfrage alle Reservierungen mit payment.transactionNo im Zusammenhang mit reservationId zurückgibt. Wenn Reservierung 1 2 Zahlungen hat, dann sollte sie 1 Buchungszeile mit 2 Zahlungsdatensätzen zurückgeben, die sich auf diese bestimmte Reservierung beziehen. und wenn es jetzt eine Zahlung für eine Reservierung gibt, sollte sie noch eine Reservierungszeile mit einer leeren Zahlung zurückgeben. –

+0

Sie sollten auch GROUP BY reservationId verwenden, damit alle Zahlungen, die sich auf diese Reservierung beziehen, nur darauf gruppiert werden. – Tom

+0

nein, es funktionierte nicht einmal nach der Verwendung von GROUP BY, mit diesem es 1 Reservierung mit nur 1 Zahlungszeile nicht alle Zahlungen Zeile im Zusammenhang mit dieser Reservierung –