Laravel: zählt die Anzahl der Zeilen in einer Beziehung

Ich habe die folgende Beziehung:

  • Ein Ort hat viele Angebote,
  • Einem bieten hat viele Aufträge

Habe ich die folgende Beredte Modell, um dies darzustellen:

class Venue {
    public function orders()
    {
        return $this->hasManyThrough(Order::class, Offer::class);
    }
}

Ich möchte, um zu bestimmen, die Gesamtzahl der Bestellungen für Veranstaltungen mit location_id = 5 mit Laravel ist Eloquent Modell.

Nur so habe ich es geschafft, dies zu tun ist wie folgt:

$venues = Venue::where('location_id', 5)->with('orders')->get();

$numberOfOrders = 0;
foreach($venues as $venue) {
    $numberOfOrders += $venue->orders->count();
}
dump($numberOfOrders); //Output a single number (e.g. 512)

Dies ist jedoch offensichtlich nicht sehr effizient, da bin ich der Berechnung der Anzahl durch die Verwendung von PHP anstelle von SQL.

Wie kann ich dies tun, indem Sie Beredt Modell allein.

InformationsquelleAutor Yahya Uddin | 2017-10-03



3 Replies
  1. 1
    $venues = Venue::with([
        'orders' => function ($q) {
            $q->withCount('orders');
        }
    ])->get();

    dann verwenden Sie es auf diese Art und Weise für immer single record

    $venues->first()->orders->orders_count();

    Alternativ können Sie auch auf diese Weise für die Sammlungen

    foreach($venues as $venue)
    {
    echo $venue->order_count;
    }
  2. 1

    Wenn Sie mit Laravel 5.3 oder höher können Sie withCount.

    Wenn Sie wollen zählen Sie die Anzahl der Ergebnisse, die aus einer Beziehung ohne
    tatsächlich laden können Sie die withCount Methode, die
    Ort a {Bezug}_count Spalte auf der daraus resultierenden Modelle. Zum Beispiel:

    $venues = Venue::withCount(['orders'])->get;
    
    foreach ($venues as $venue) {
        echo $venue->orders_count;
    }

    Lesen Sie mehr über withCount im Laravel Dokumentation.

    Wenn Sie niedriger als 5.3, können Sie eine benutzerdefinierte Bezug auf Ihre Venue Modell:

    public function ordersCount()
    {
        return $this->belongsToMany('App\Models\Order')
            ->selectRaw('venue_id, count(*) as aggregate_orders')
            ->groupBy('venue_id');
    }
    
    public function getOrderCount()
    {
        //if relation is not loaded already, let's do it first
        if (!array_key_exists('ordersCount', $this->relations)) {
            $this->load('ordersCount');
        }
    
        $related = $this->getRelation('ordersCount')->first();
        //then return the count directly
        return ($related) ? (int) $related->aggregate_orders : 0;
    }

    die dann verwendet werden können als: Venue::with('ordersCount');. Der Vorteil dieses custom-Verhältnis ist Sie nur Abfragen, die zählen eher als die Abfragen alle diese Beziehungen, wenn Sie nicht notwendig sind.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.