2016-05-31 15 views
0

Ich habe zwei Tabellen website_link und website_links_type. website_link ist mit einer hasmany-Beziehung verwandt.Laravel 5.2 eloquente Reihenfolge von On-Beziehung Ergebnis Anzahl

$this->website_links->where('id',1)->Paginate(10); 

und Beziehung

public function broken() 
{ 
    return $this->hasMany('App\Website_links_type')->where('status_code','!=',"200"); 
} 

Jetzt will ich von website_link Tabelle führen zu erhalten, aber orderby, die auf Anzahl der zerbrochenen Beziehung Ergebnis führen.

Antwort

0

Sie können die WHERE-Bedingung nicht in die Modelldatei einfügen.

Sie geben nur hasMany in Modelldatei.

Und verwenden Sie, wo Bedingung in Controller-Seite.

Siehe Dokument this.

diese Datei

Modell Versuchen:

public function broken() 
{ 
    return $this->hasMany('App\Website_links_type'); 
} 

Controller-Datei:

$model_name->website_links->where('id',1) 
      ->where('status_code','!=',"200") 
      ->orderBy('name', 'desc') 
      ->Paginate(10); 
+0

danke für deine antwort. und was ist mit Orderby auf Beziehung gebrochene Anzahl ??? –

+0

Für orderBy können Sie orderBy() im Controller verwenden. Und bitte mehr angeben über ** Beziehung gebrochene Anzahl ** –

+0

Ich weiß nicht, was @KetavChotaliya spricht, aber Sie können eine 'Where' -Klausel in Ihrem Modell ganz gut setzen. Wenn keine Methodenkette bereitgestellt wird, wird der Abfragegenerator geschlossen und eine Eloquent-Auflistung zurückgegeben. Wenn weitere Methodenketten bereitgestellt werden, fügt die Builder-Beziehung am Ende weitere Argumente hinzu. – Ohgodwhy

1

Es gibt viele Möglichkeiten, dieses Problem zu lösen. In meiner Antwort werde ich zwei verwenden, die ich kenne.

Sie können Ihre Beziehung laden und die Funktion sortBy() verwenden. Ich glaube jedoch nicht, dass Sie die Funktion paginate() mit dieser Lösung verwenden können.

Beispiel:

$results = Website_link::with('website_links_type')->get()->sortBy(function ($website_link) { 

    return $website_link->website_links_type->count(); 

}); 

See this answer

Sie können auch rohe Abfragen verwenden, um dieses Problem zu lösen. Mit dieser Lösung können Sie immer noch die Paginierungsfunktionalität verwenden (glaube ich).

Beispiel:

$results = Website_link 

    ::select([ 
     '*', 
     '(
      SELECT COUNT(*) 
      FROM website_links_type 
      WHERE 
       website_links_type.website_link_id = website_link.id 
      AND 
       status_code <> 200 
     ) as broken_count' 
    ]) 

    ->orderBy('broken_count') 

    ->paginate(10); 

Sie müssen möglicherweise die Spaltennamen ändern, um Ihre Datenbank übereinstimmen.