2014-05-09 35 views
7

In Laravel, habe ich zwei Tabellen namens Booking und Clients. Für eine bestimmte Buchung habe ich eine Beziehung zu einem einzelnen Kunden. Alles funktioniert gut, wenn ich einen Kunden nach einer Buchung frage, außer wenn ich oderWhere einschließe. Bitte sehen Sie sich das unten stehende Code-Snippet an.oderWenn nicht mit Laravel eloquent Beziehung Abfrage

if($client_name!=null) 
     { 
      $client_name='%'.$client_name; 
      $bookings=$bookings->whereHas('client',function($q) use ($client_name){ 
       $q->where('first_name','LIKE',$client_name) 
        //->orWhere('last_name','LIKE',$client_name);     
      }); 
     } 

Mit dem kommentierten aus orWhere Linie, erhalte ich die richtigen Buchungen mit dem Kunden mit first_name wie vom Benutzer angegeben. Aber wenn ich oder in der Abfrage für last_name verwende, werden alle Zeilen angezeigt, als wenn last_name für jede Zeile übereinstimmen.

Was ist los damit? Hilfe bitte.

+0

Überprüfen Sie die Abfrage, die mit 'DB :: getQueryLog()' zum Beispiel –

+0

ausgeführt wird Folgendes ist die letzte Ausgabe: Wählen Sie * aus 'Drosselung' wo 'user_id' =? Limit 1. Ich verwende das Sentry-Paket zur Authentifizierung. Die obige Abfrage wird auf der Admin-Seite ausgeführt. – sangam

+0

Dies sagt uns nichts, überprüfen Sie die Tabelle für Clients. Führen Sie einfach den Code, den Sie eingefügt haben und sofort 'dd (DB :: getQueryLog())' oder einfach in CLI mit artisan tinker –

Antwort

9

Das Problem ist, dass Sie jetzt einen solchen Code haben:

WHERE foreignKey = X AND first_name = Y OR last_name = Z 

es ist so offensichtlich nicht zurückkehrt, was es sein sollte.

Jetzt, damit es funktioniert, müssen Sie diese Einschränkungen als Unter hinzuzufügen wo:

$bookings=$bookings->whereHas('client',function($q) use ($client_name){ 
      $q->where(function ($q) use ($client_name) { 
       $q->where('first_name','LIKE',$client_name) 
        ->orWhere('last_name','LIKE',$client_name); 
      }); 
     }); 

Das ist wie in einer Abfrage führt:

WHERE foreignKey = X AND (first_name = Y OR last_name = Z) 

das ist, was Sie brauchen.

+0

Arbeitete wie ein Charme! Vielen Dank. – sangam

Verwandte Themen