Je veux avoir une relation plusieurs-à-plusieurs. J'ai donc créé: le modèle Into Game

public function category(){
      return $this->belongsToMany('App\Category');
  }

Dans le modèle de catégorie

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

Dans le contrôleur

$category = Category::where('slug', $slug)->first();
      dd($category->games());
      return view('frontend.game.gamelist')->with('elements', $category->games());

En général, j'essaye d'afficher tous les jeux appartenant à une catégorie particulière. Je vois quelque chose comme ça entrez la description de l'image ici

Si je supprime dd (), la vue n'affichera aucun élément, mais cela ne pose aucun problème avec la vue.

@foreach($elements as $element)
//...
@endforeach

Pourquoi ça ne marche pas?

1
MrBelongsTo 20 nov. 2018 à 16:49

4 réponses

Meilleure réponse

Votre modèle Category doit également avoir belongsToMany dans sa relation games().

public function games() {
    return $this->belongsToMany('App\Game');
}
0
Jerodev 20 nov. 2018 à 13:51

Vous utilisez des données à chargement différé

Laravel éloquent Lazy Vs. Désireux chargé

Mettez à jour votre méthode de contrôleur:

$category = Category::with('games')->where('slug', $slug)->first();
dd($category->games);

return view('frontend.game.gamelist')->with('elements', $category);

Vous devez obtenir toute la catégorie avec les jeux, afin que vous puissiez obtenir ces données avec une requête, les voir également dans la fonction dd.

Si vous n'obtenez que la catégorie et que vous faites category->games(), une autre requête sera exécutée dans votre vue.

0
Emtiaz Zahid 20 nov. 2018 à 13:56

Quand vous faites:

$category->games();

Vous accédez à la relation elle-même (utile pour attacher des contraintes), pas aux éléments de la relation. Consultez cette autre réponse pour une explication détaillée.

Essayez plutôt ceci:

$category->games;

OBS

Lors d'une relation plusieurs-à-plusieurs, belongsToMany La méthode doit être spécifiée dans les deux modèles.

Category.php

public function games()
{
      return $this->belongsToMany('App\Game');
}
0
Kenny Horna 20 nov. 2018 à 13:58

Vous devez également avoir une relation belongsToMany dans votre modèle Category pour avoir une relation plusieurs-plusieurs. Vous pouvez y parvenir en faisant:

public function games() 
{
    return $this->belongsToMany('App\Game');
}

Ensuite, dans votre contrôleur de catégorie, vous avez:

$category = Category::with('games')->where('slug', $slug)->get();

return view('frontend.game.gamelist', compact('category');

Ensuite, dans votre vue, vous pouvez accéder à la liste des jeux en

@foreach($category->games as $game)
//...
@endforeach
0
petersowah 20 nov. 2018 à 14:10