Laravel 5

Récupération de donnée dans une collection

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Bonjour,

    J'essaie d'optimiser un peu mon code. Je travail sur un projet qui propose des vidéos. Je voudrais récupérer des vidéos pour la page d'acceuil en fonction de la catégorie auquelle elles apparetiennent. Comme une vidéo peu avoir plusieur catégories, j'ai mis en place une relation BelongsToMany. Tous fonctionne bien.

    J'ai créer une petite fonction dans mon VideoRepository qui me permet de récupéré toutes les vidéos d'une ou plusieurs catégorie:

    public function getByCategory($id):Collection {
    $ids = !is_array($id)? [$id] : $id;

    return $this->video::with('categories')->whereHas('categories', function ($query) use ($ids) {
    $query->whereIn('video_category_id', $ids);
    })->get();
    }

    Dans mon cas j'aimerais récupéré les vidéos de la catégorie A puis de la catégorie B a partir de ma collection:

    $videos = $this->videoR->getByCategory([VideoCategorie::CATEGORIEA, VideoCategorie::CATEGORIEB]);

    $categorieA = $videos->where('video_category_id', VideoCategorie::CATEGORIEA);
    $categorieB = $videos->where('video_category_id', VideoCategorie::CATEGORIEB);

    Je sais que le "->where" ne fonctionne pas mais je ne sais pas comment faire :( Cela éviterait plusieurs requète inutile !

    Dans ma collection initiale, j'ai trois collection "vidéo" et dans ces collections, j'ai une propriété une propriété relation.

    Merci d'avance

    Methos

  • Avatar de nash
    Membre depuis :
    16/04/2019
    Messages :
    14

    Salut

    public function getByCategory(...$id):Collection {

    return $this->video::with('categories')->whereHas('categories', function ($query) use ($ids) {

    $query->whereIn('video_category_id', $ids);

    })->get()->groupBy('le champ de regroupement');

    }

    La doc

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Bonjour, merci pour la réponse mais j'aimerais les regrouper par une colonne de la table pivot ... et cela ne fonctionne pas :'(

    si je mets le nom de la fonction représentant la relation ('categories'), j'ai une erreur. Si je met le nom de la colonne dans la table pivot ('video_category_id'), j'obtiens cela:

    Collection {#527 ▼

    items: array:1 [▼

    "" => Collection {#481 ▼
    #items: array:3 [▼
    0 => Video {#517 ▶}
    1 => Video {#518 ▶}
    2 => Video {#519 ▶}
    ]
    }

    ]
    }

  • Avatar de Methos
    Membre depuis :
    06/05/2019
    Messages :
    18

    Bonjour,

    Petit Up :D

  • Avatar de alexisgeneau
    Membre depuis :
    16/05/2019
    Messages :
    3

    Salut,
    Je ne sais pas si je comprend bien ce que tu veux mais je pense que pour les regrouper par catégorie, le plus simple c'est d'utiliser ton model Categorie et de faire un ->with('videos')

  • Avatar de jmatike
    Membre depuis :
    07/04/2019
    Messages :
    19

    Je pense aussi que le mieux c'est de recuperer toutes les vidéos et leur catégories en eager loading, et dans la collection faire le traitement.

    Encore que j'ai l'impression que getByCategory($id) veut dire "récupère toutes les vidéos de la catégorie $id", et dans ce cas si l'algo est bon, on ne devrait pas avoir deux catégories différentes dans le résultat, alors que l'idée de départ semble être le contraire.

Vous ne pouvez pas répondre à ce sujet.