2015-07-25 28 views
8

Ich habe Schwierigkeiten, die Beziehung Anzahl Bedingung in WhereHas zu verstehen. Die Dokumentseite hat keine Diskussion darüber, aber API page spricht darüber. Zitat von der API.Was ist Beziehungsanzahl Bedingung in WhereHas Laravel

Builder | Builder whereHas (string $ Beziehung, Closure $ Rückruf, string $ operator = '> =', int $ count = 1)

eine Beziehung Zählbedingung auf die Abfrage hinzufügen mit where-Klauseln .

Beispiel

A Resource Modell hat zu vielen Bezug auf ResourceCategory

public function categories() 
{ 
    return $this->belongsToMany('ResourceCategory', 'resource_category_mapping'); 
} 

Relationsbedingung Viele in Hat

Die Beziehung Zustand in Has wie erwartet funktioniert.

Resource::has('categories', '>', 1)->get() 
//this return all resources which have more than one catgories 

Beziehung Zustand in WhereHas

Die Beziehung Zustand in WhereHas funktioniert nicht wie erwartet. Ich bin sicher, ich habe es falsch verstanden.

Resource::whereHas('categories', function ($query){ 
      $query->whereIn('resource_category_id', [1, 2, 4]); 
     }, '>', 1)->get() 

Der obige Code sollte Ressourcen zurück, die die Kategorien gehören einen der [1, 2, 4], und die Ressource hat mehr als eine Kategorie. Aber es ist nicht.

Frage

bitte die Beziehung Zustand in WhereHas erklärt, kann ein Beispiel werden, vorausgesetzt, wäre viel hilfreich.

Antwort

10

Normalerweise whereHas() überprüft, ob Ihr Modell mindestens ein verwandtes Modell hat. Sie können $ count auf einen höheren Wert setzen, um die Anzahl auf N zu erhöhen und nur die Modelle abzurufen, die mindestens N verwandte Modelle haben.

In Ihrem Fall, kehrt

Resource::has('categories', '>', 2)->get(); 

Aufruf nur die Ressourcen die mindestens 2 verbundenen Kategorien haben.

+1

können Sie meine Erklärung zu meinem whereHas Code überprüfen 'Der obige Code sollte Ressourcen zurückgeben, deren Kategorien entweder zu [1, 2, 4] gehören und die Ressource mehr als eine Kategorie hat'. Ist das richtig...? – hhsadiq

+0

Funktioniert für mich. Bitte fügen Sie die Abfrage ein, die Sie erhalten - ersetzen Sie get() durch toSql() - und fügen Sie es hier ein. –

+0

Wählen Sie * aus 'Ressource' aus, wobei' Ressource'.deleted_at' null ist und 'Vorname_ =? und (wählen Sie count (*) aus 'resource_category' innerer Join' resource_category_mapping' in 'resource_category'.'id' =' resource_category_mapping''resource_category_id' wo 'resource_category_mapping''resource_id' =' resource'.id' und 'resource_category_id' in (?,?,?,?)) = 3 – hhsadiq

Verwandte Themen