2017-05-31 3 views
0

In Laravel 5.4, ich meine Beziehung haben:Laravel 5: Count Produkt nach Kategorie, in der nur aktiv Produkt

public function products() 
{ 
    return $this->hasMany(Product::class); 
} 

public function category() 
{ 
    return $this->belongsTo(Category::class); 
} 

Und meine Frage ist:

$x = Category::with('products')->where('active', 1)->get(); 

Es tut richtig alle Kategorienamen zeigen, aber wie zählt man nur Produkt 'active = 1'? Ich möchte nicht alle Produkte, sondern nur aktive Produkte zählen.

Antwort

0

versuchen Sie dies:

$x = Category::with(['products' => function($query) { $query->where('active','=', 1); }])->where('active', 1)->get(); 

, dass Sie Produkte geben, die aktiv sind und dann nur Kategorien, in denen Produkte aktiv sind.

+0

Großartig! Es funktioniert genau so, wie ich es möchte. Danke, kambythet – Devith

+0

Zwischen diesem Weg und wählen Sie zwei Tabellen, welche die beste führt? – Devith

+0

Ein Join wird im Allgemeinen besser funktionieren, solange Ihre Indizes vorhanden sind. Spalte Charset und Kollation sind bei beiden identisch (für textbasierte Spalten). Dies liegt am Datenbankoptimierer. Bei Verwendung der Laravel-Methoden, wie sie hierin beschrieben sind, werden zwei Abfragen ausgeführt, anstatt nur eine. – kambythet

0

ich davon aus sind Sie haben active Feld für Produkt sowie Kategorie.

Probieren Sie diese Abfrage

$x = Category::whereHas('products', function ($query) { 
    $query->where('products.active', 1); 
})->where('categories.active', 1) 
->get(); 
+0

Ich habe es versucht, aber nicht funktioniert. Das Problem ist, dass es nur eine Kategorie anzeigt und alle Produkte zählt, sogar aktives Feld = '0'. – Devith

0

die Sie interessieren präziser zu sein. Zusätzliche aus der Idee von @linuxartisan

$x = Category::whereHas('products', function ($query) { 
     $query->where('products.active', '=', 1); 
    }) 
    ->where('categories.active', '=', 1) 
    ->get(); 
+0

Funktioniert gut. Vielen Dank – Devith

Verwandte Themen