Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je cherche à récupérer l'id d'un manga à partir de l'id d'un volume, pour ensuite envoyer la liste des personnages avec avec l'id du manga

class Mangas extends Model {
        public function volumes(){
                return $this->hasMany('App\Volumes');
        }
class Volumes extends Model {
       public function manga()
     {
        return $this->belongsTo('App\Mangas');
    }
public function show($id)
    {
        $chapters=\App\Volumes::find($id)->chapters;

        $manga=\App\Mangas::find($id)->first()->id_Manga;

        $characters = \App\Mangas::find($manga)->characters;

        return view('chapters.index', compact('chapters','characters'));
    }

Ce que j'obtiens

Cependant, chose bizarre, lorsque je fais

$manga=\App\Mangas::find($id)->manga; 

Ca marche pas. Par contre :

$manga=\App\Mangas::find($id)->first()->id_Manga;

Ca marche, et je voudrais savoir pourquoi le premier marche pas. Dans le vardump, il me renvoit null

4 réponses


lolotoobo
Réponse acceptée

Oui c'est bien que je pensais :( tes indexs (champs increments) ne sont pas bien nommés, tu mets des majuscules

Prends l'habitude :

Model au singulier,
Controller au pluriels

Champ increments se nomme id
champs date utilise timestamp plutot que date : ca te permet d'utiliser Carbon

champs de liaison au format : model_champ

Si tu veux garder ta structure actuelle alors dans tes return $this->xxxxx(table, foreignKey, localKey) et modifie dans ton model protected $primaryKey

En revanche je comprends toujours pas d'où tu peux avoir quelque chose avec
$manga=\App\Mangas::find($id)->manga; car tu n'as aucun champs manga dans ta table mangas. En revanche faire un find($id) est équivalent à find($id)->first() sauf que le first() est inutile. Si tu cherche sur l'index primaire tu n'as pas besoin de dire de n'en récupérer qu'un seul :)

Dans ton cas je ferais plutot un truc du style (une fois mis les champs de liaison)

$manga = App\Volumes::find($id)->manga;

Et voilà dans $manga tu as tes infos sur le manga

Coucou,

Je ne sais pas si c'est la cause du soucis mais voir un model au pluriel ca ne me rassure pas. Sans connaitre tes champs ca complique pour t'aider mais dans ton cas essaie de renseigner le foreignKeyet le localKey de tes liaisons, car je sens que tu n'utilise pas les standards de Laravel, donc tu dois tout lui préciser.

Il serait d'ailleurs plus simple pour toi d'essayer de rester dans les standards comme par exemple au lieu de id_Mangasutilise manga_id. De plus évite d'avoir des majuscules dans le nom des champs après un _. Les 2 veulent dire la même chose mais vont te foutre un sacré bordel et de faire plein de bugs :)

Edit : tu devrais aussi remplacer 'App\Mangas' par App\Mangas::class. Ca change rien au code, mais ca permet à ton IDE de t'afficher les liaisons de table

Zekura
Auteur

Pour la table manga j'ai ca

Schema::create('mangas', function(Blueprint $table)
        {
            $table->engine = "InnoDB";
            $table->increments('id_Manga');
            $table->string('title_Manga_Fr', 255);
            $table->date('start_Date_Manga');
            $table->date('end_Date_Manga');
            $table->longText('description_Manga_Fr');
            $table->longText('trailer_Manga_Fr');
            $table->string('country_Manga', 255);
            $table->string('type_Manga', 255);
            $table->boolean('logo_Manga')->default(false);
            $table->string('slug_Manga')->unique()->index();
            $table->timestamps();
        });

et pour la table volume

Schema::create('volumes', function(Blueprint $table)
        {
            $table->engine = "InnoDB";
            $table->increments('id_Volume');
            $table->bigInteger('number_Volume');
            $table->bigInteger('number_Pages_Volume');
            $table->integer('mangas_id')->unsigned()->index();
            $table->foreign('mangas_id')
                ->references('id_Manga')
                ->on('mangas')
                ->onDelete('restrict')
                ->onUpdate('restrict');
            $table->timestamps();
        });
Zekura
Auteur

Merci beaucoup ! De toute facon c'est un petit projet pour m'habituer à Laravel, et je compte prendre des bonnes habitudes !