Bonjour,
Voila je rencontre un petit problème avec mon code.
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'));
}
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
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 foreignKey
et 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_Mangas
utilise 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
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();
});
Merci beaucoup ! De toute facon c'est un petit projet pour m'habituer à Laravel, et je compte prendre des bonnes habitudes !