Besoin d'aide ?

SQLSTATE[42S22]: Column not found

Avatar de Jelll
Jelll

Bonjour je cherche à faire un systeme d'ajout à une liste (favorite et planning) mais ma method planning ne marche pas et stock les données dans la table favorite au lieu de celle de planning

j'ai ce code :

public function add($manga)
    {
        $user = Auth::user();
        
        $isPlanned = $user->planning_manga()->where('id_manga',$manga)->count();

        if ($isPlanned == 0)
        {
            $user->planning_manga()->attach($manga);
            Toastr::success('Post successfully added to your planning list :)','Success');
            return redirect()->back();
        } else {
            $user->planning_manga()->detach($manga);
            Toastr::success('Post successfully removed from your planning list :)','Success');
            return redirect()->back();
        } 
    }
}

et cette erreur :

Illuminate\Database\QueryException
SQLSTATE[42S22]: Column not found: 1054 Champ 'id_manga' inconnu dans where clause (SQL: select count(*) as aggregate from `mangas` inner join `manga_user` on `mangas`.`id` = `manga_user`.`manga_id` where `manga_user`.`user_id` = 1 and `id_manga` = 1)

Le schema pour le planning (j'ai le meme pour favorite avec manga_id à la place de id_manga et celui ci marche) :

Schema::create('manga_user_planning', function (Blueprint $table) {
            $table->id();
            $table->integer('id_manga')->unsigned();
            $table->integer('user_id');
            $table->foreign('id_manga')->references('id')->on('mangas')->onDelete('cascade');
            $table->timestamps();
        });

Merci de votre aide.

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

As-tu bien mit les champs dans le $fillable = [] de ton model manga_user_planning.php ?

Avatar de Jelll
Jelll

Salut merci de ta réponse,

Non je n'ai pas mis ça mais ça marche quand meme pour le favorite pourtant

j'ai ca pour mon model Manga

public function favorite_to_user()
    {
        return $this->belongsToMany(User::class);
    }

    public function planning_to_user()
    {
        return $this->belongsToMany(User::class);
    }

et ca pour le model User

public function favorite_manga()
    {
        return $this->belongsToMany(Manga::class);
    }

    public function planning_manga()
    {
        return $this->belongsToMany(Manga::class);
    }

Mais il n'y a que favorite qui marche

Avatar de CinquièmeDimension
CinquièmeDimension

Dans ton schema, tu nous montre que manga_user_planning.id_manga existe mais dans ta requete il n'est pas question de cette table. Dans ton erreur on voir la requete:

select count(*) as aggregate
from `mangas`
inner join `manga_user` on `mangas`.`id` = `manga_user`.`manga_id`
where `manga_user`.`user_id` = 1
and `id_manga` = 1

On voit donc qu'il existe un manga_id dans la table manga_user mais pas de id_manga

Donc j'en arrive a la conclusion que tu as marqué id_manga au lieu de manga_id dans ton controller ...

Donc ==> $isPlanned = $user->planning_manga()->where('manga_id',$manga)->count();

J'ai bon ?

Avatar de Jelll
Jelll

Dans mon PlanningController j'ai bien

$isPlanned = $user->planning_manga()->where('id_manga',$manga)->count();

Dans mon FavoriteController(celui qui fonctionne)

$isFavorite = $user->favorite_manga()->where('manga_id',$manga)->count();

Si je met where('manga_id',$manga) dans le PlanningController ça me rentre les données dans la table manga_user_favorite au lieu de manga_user_planning

Avatar de CinquièmeDimension
CinquièmeDimension

Dans tous les cas la ligne $isPlanned = $user->planning_manga()->where('id_manga',$manga)->count(); est fausse car id_manga n'existe pas.

L'erreur viens peut-être du fait que tes fonction User::favorite_manga(); et User::planning_manga(); sont strictement identiques..

Il faut peut-être revoir la modélisation à la base. Je ne suis pas sûr qu'il faille aller taper dans le model User... Il faut peut-être plutot aller interroger manga_user_planning. D'ailleurs ton champ manga_user_planning.id_manga est une clé étrangere mais pas manga_user_planning.user_id (tu as d'ailleurs, dans l'ensemble de ton projet, un problème de convention. Il faut choisir entre xxx_id et id_xxx)

Avatar de Jelll
Jelll

Ducoup j'ai essayer de créer un nouveau model

class MangaUserPlanning extends Model
{
    use HasFactory;
    protected $table = 'manga_user_planning';

    public function planning_to_user()
    {
        return $this->belongsToMany(User::class);
    }
}

Je sais pas si j'ai bien fais de tenter mais toujours la meme erreur. Meme en mettant $isPlanned = $user->planning_manga()->where('manga_id',$manga)->count(); ca me met les données dans la table manga_user (celle de favorite)

C'est vrai que c'est bizarre, je viens de mettre le champ manga_user_planning.user_id en clé étrangère ca ne l'était pas non plus pour le favorite mais marchait quand meme.

Pour le manga_id et id_manga je me suis dit qu'il fallait que je les nommes différemments pour tester pour pas que les données s'entremellent mais c'est raté ducoup.

Vous ne pouvez pas répondre à ce sujet.