3 votes

ORM Laravel5 : comment aliaser plusieurs withCount sur le même objet connexe ?

J'ai un Hôtel modèle qui a de nombreux Chambres qui peuvent être occupé . Comment dois-je demander cette information ?

Liste des hôtels

  • le nombre de pièces
  • le nombre de chambres occupées

La requête :

$hotels = Hotel::where('foo',$bar)
->withCount('rooms')
->withCount(['rooms' => function ($query) {
    $query->where('status', 'Occupied');
    }])
->get();

Le résultat :

$hotel->rooms_count donne le nombre de chambres occupées, qui est le dernier élément de la liste. withCount expression.

Ce que j'essaie d'obtenir

  • $hotel->rooms_count comme le nombre de chambres dans chaque hôtel

  • $hotel->occupied_rooms_count comme le nombre de chambres occupées de chaque hôtel

comme un alias du second withcount :

Question

Existe-t-il un moyen de alias le second withCount sur la chambre ?

10voto

Paulo Freitas Points 3039

Bien que la réponse de @jaysingkar soit une bonne façon de procéder et réponde assez bien à la question, oui, il est possible d'aliaser un withCount() appelez bien que cela n'ait pas encore été documenté :

$hotels = Hotel::where('foo', $bar)
    ->withCount([
        'rooms',
        'rooms AS occupied_rooms' => function ($query) {
            $query->where('status', 'Occupied');
        }
    ])
    ->get();

Cela vous donnera le $hotel->occupied_rooms_count avec le nombre de chambres occupées de chaque hôtel. :)

Le code où la magie opère peut être vu ici . Il a été ajouté dans Laravel 5.3.7 par le biais de l'option PR #15279 .

Mis à jour : J'ai soumis un PR et il est maintenant correctement documenté . :)

3voto

jaysingkar Points 3062

Au lieu de spécifier where dans votre withCount définir la relation pour les chambres occupées dans Hotel Modèle.

public function occupied_rooms(){
    return $this->hasMany(Room::class)
                ->where('status', 'Occupied');
}

Maintenant, dans votre utilisation du contrôleur, withCount('occupied_rooms') .

$hotels = Hotel::where('foo',$bar)
->withCount(['rooms','occupied_rooms'])
->get();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X