Besoin d'aide ?

Eloquent belongsToMany

Avatar de Yassine
Yassine

Bonjour à tous Je débute avec laravel et je bloque sur un point: J'ai une table Author, une table book , et une table pivot book_author(qui contient book_id et author_id) J'essaye donc de lier un book à son/ses auteurs grâce à la relation belongsToMany mais quand je fais dans la vue :

    @foreach ( $books as $book )
        <span> {{$book->title}} </br> 
        <img class ="bookimg" src= {{ $book->cover }} />
        <p class="authors">by:
            @foreach($book->authors as $author) 
                <span>{{$author->name}}</span>
            @endforeach
        </p>
    @endforeach

Ca me renvoie tous les auteurs de la DB au lieu de m'envoyer ceux reliés à un certain livre.

Voici mon modèle Book.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Author;

class Book extends Model
{
    use HasFactory;
    protected $table = 'books';
    public $timestamps = false;
    protected $primaryKey = 'id';

    public function authors(){
        return $this->belongsToMany(Author::class, 'book_author', 'book_id');
    }

}

Author.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    //use HasFactory;
    protected $table = 'authors';
    public $timestamps = false;
    protected $primaryKey = 'id';

    public function books() 
    {
        return $this->belongsToMany(Book::class,'book_author');
    }
}

et bookAuthor.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\Pivot;

class bookAuthor extends Pivot
{
    protected $table = 'book_author';
    public $timestamps = false;
    protected $primaryKey = ['book_id','author_id'];
    public $incrementing = false;
}

Merci pour votre aide !

Posté il y a 4 mois
Avatar de samsam
samsam

salut dans la table pivot il faut respecter l'ordre alphabétique** author_book**

Posté il y a 4 mois
Avatar de Yassine
Yassine

Salut, Je viens de reprendre le projet d'ou le fait que je n'ai pas vu ta réponse. Concernant la table pivot, je n'ai pas le droit de modifier son nom car ce sont les consignes du projet. J'ai quand même essayé author_book au lieu de book_author mais ça ne change rien. Je vois que eloquent n'essaye même pas d'accéder à la table pivot (pourtant nécéssaire pour la relation belongsToMany) car en mettant un faux nom de table, il n'y a pas d'exception déclenchée. Mon but final est seulement d'accéder , pour chaque livre , à son/ses auteurs. Quelqu'un aurait une idée? Mercii

Posté il y a 1 mois
Avatar de Yassine
Yassine

Problème réglé: La clé primaire de la DB était un string et non un entier, j'ai du la spécifier avec protected $keyType = 'string'; et ça marche désormais.

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.