2017-01-20 10 views
0

ich diesen Code habe richtig $sector = Sector::where('ref_id', $sectorId)->with('offers.provider')->first(); arbeiten, die für mehr Flexibilität und mehr Verständnis von dem, was ich tun will, um den Code unten geändert wurde:Where-Klausel Abfrage mit Laravel Eloquent

$sector = Sector::where('ref_id', '$sectorId') 
->with(
    [ 
     'offers' => function($query) { 
      $query->with(
       [ 
        'provider' => function($query) { 
         $query->select('name'); 
        } 
       ] 
      ); 
     } 
    ] 
) 
->first(); 

wir also hier einnehmen a sector, die offers Verbindung zu dieser sector und unter jeder offer, nehmen wir die verbundenen provider. Jetzt haben providers eine status, die entweder 0 oder 1 ist. Also, basierend auf meinem Code oben, gibt es eine Möglichkeit, NUR offers, die providers mit dem Status 1 haben?

Bitte helfen Sie mir, dieses Problem zu lösen.

Antwort

0

Sie whereHas verwenden können - die spezifisch ist entworfen, um für solche Szenarien zu arbeiten. Das Beispiel aus der Dokumentation:

Wenn Sie noch mehr Energie benötigen, können Sie die whereHas und orWhereHas Methoden verwenden, um "wo" Bedingungen auf Ihre Abfragen zu setzen. Diese Methoden können Sie individuelle Einschränkungen zu einer Beziehung Einschränkung, wie die Überprüfung der Inhalt eines Kommentars hinzuzufügen:

// Retrieve all posts with at least one comment containing words like foo% 
$posts = Post::whereHas('comments', function ($query) { 
    $query->where('content', 'like', 'foo%'); 
})->get(); 

Sie nicht das Snippet täuschen lassen, es wird funktionieren sehr gut in einem closure als du hast oben.

0

Haben Sie versucht, eine Where-Klausel in die Provider-Abfrage einzufügen, um nur Provider mit dem Status 1 zu holen?

'provider' => function($query) { 
    $query->select('name')->where('status', 1); 
} 

EDIT: Ich bin kein Experte auf Laravel aber vielleicht ein Beispiel für eine Abfrage, die ich mit Mühe hatte vielleicht etwas Licht auf das Problem werfen:

$dealer = $this->dealer->where('foreign_dealer_id', $dealerIdInFeed) 
      ->where(function ($subQuery) use ($accountTypes) { 
       if(count($accountTypes) > 1) 
       { 
        foreach($accountTypes as $accountType) 
        { 
         $subQuery->orWhere('account_type', $accountType); 
        } 
       } 
       else 
       { 
        $subQuery->orWhere('account_type', $accountTypes); 
       } 
      }) 
      ->first(); 
+0

ja und ich bekomme nicht die erwarteten Ergebnisse –

+0

Ich aktualisierte meine Antwort mit etwas, das Ihnen helfen könnte zu verstehen, wie Sie Ihr Problem lösen können. – VenomRush

+0

Es kann auch hilfreich sein zu zeigen, wie Ihre Tabellenstruktur in Ihrer Datenbank aussieht. – VenomRush