Laravel 5

Affichage suite à @foreach imbriqués

  • Avatar de almoha
    Membre depuis :
    19/06/2017
    Messages :
    12

    Bonjour,

    Voici mes models :

    1 - Oeuvre

    <?php

    namespace App\Model;

    use Illuminate\Database\Eloquent\Model;

    class Oeuvre extends Model
    {
    protected $fillable = [
    'titre', 'resume', 'editeur_id',
    ];

    public function editeur()
    {
    return $this->belongsTo(Editeur::class);
    }

    public function contributeurs()
    {
    return $this->belongsToMany(Contributeur::class);
    }

    public function images()
    {
    return $this->morphMany(Image::class, 'imageable');
    }
    }

    2-Contributeur

    <?php

    namespace App\Model;

    use Illuminate\Database\Eloquent\Model;

    class Contributeur extends Model
    {
    protected $fillable = [
    'prenom', 'nom',
    ];

    public function oeuvres()
    {
    return $this->belongsToMany(Oeuvre::class);
    }

    public function images()
    {
    return $this->morphMany(Image::class, 'imageable');
    }
    }

    Mon controller

    class OeuvreController extends Controller
    {

    public function index()
    {

    $oeuvres = Oeuvre::with('editeur', 'contributeurs', 'images')->get();

    return view('index', compact('oeuvres'));

    }

    public function show(Oeuvre $oeuvre)
    {
    return view('show', compact('oeuvre'));
    }
    }

    La vue show

    ...
    @foreach ($oeuvre->contributeurs as $contributeur)

    <p class="card-text">{{ $contributeur->prenom }} {{ $contributeur->nom }}</p>

    @foreach ($contributeur->images as $image)
    <img class="card-img-top-center mx-auto" src="{{ asset('images/'. $image->nom) }}"
    style="height: 80px; width: 53px; display: block; padding-top: 10px ">
    @endforeach

    @endforeach

    Au niveau de l'affichage, cela donne s'il y a plusieurs contributeurs :

    titre de l'oeuvre
    image de l'oeuvre (couverture livre)
    nom editeur
    prenom-nom contributeur1
    image du contributeur 1 (sa photo)
    image du contributeur2 (sa photo)
    prenom-nom contributeur2

    alors que je souhaiterais obtenir cet affichage :

    titre de l'oeuvre
    image de l'oeuvre (couverture livre)
    nom editeur
    prenom-nom contributeur1
    image du contributeur 1 (sa photo)
    prenom-nom contributeur2
    image du contributeur2 (sa photo)

    Quel traitement dois-je faire pour obtenir ce résultat ? Merci.

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2123

    Bonjour,

    D'après le code et le résultat obtenu il semblerait que les données ne soient pas correctes. Les deux images des deux contributeurs semblent rattachées au premier contributeur.

    D'autre part les images des contributeurs ne sont pas dans l'eager loading et donc il y a génération d'une requête pour chaque image rattachée. Il faudrait compléter dans ce genre :

    $oeuvres = Oeuvre::with('editeur', 'contributeurs', 'contributeurs.images','images')->get();
  • Avatar de almoha
    Membre depuis :
    19/06/2017
    Messages :
    12

    Bonsoir,

    Merci bestmomo, effectivement il y avait un problème dans mes données test.
    Merci aussi pour l'eager loading. Comme je n'affiche les photos des contributeurs que sur la vue show, je le gère de la façon suivante :

    public function show(Oeuvre $oeuvre)
    {

    $oeuvre->load('contributeurs.images');

    return view('show', compact('oeuvre'));
    }

Vous ne pouvez pas répondre à ce sujet.