Bonjour,

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

Ce que je fais

Je crée 1 bouton qui en fonction d'un attribut boolean dans la base de données, est vert si j'ai déja le manga dans ma collection ou rouge si je l'ai toujours pas. Cette attribut se trouve dans une table pivot entre la table Volume et la table User.

//dans le vue de la serie de Manga
 @foreach($volumes as $c)
            <div class="col-md-2">
                <h3 class="text-left">
                    {{ $c->number_Volume }}
                </h3>
                <h4 class="text-left">
                    {{ $c->title_Volume_Fr }}
                </h4>
                <?php
                    $lu = DB::table('volumes_user')->where('user_id', '=', Auth::user()->id)->where('volumes_id', '=', $c->id_volumes)->first();
                    //var_dump($lu);

                ?>
                @if($lu->read_volumes_user=='0')
                    <form action="{{action('VolumesUserController@update',['id'=>$lu->id_volumes_user])}}" method="post">
                        <input type="hidden" name="_token" value="{{csrf_token()}}" />
                        <input type="hidden" name="_method" value="put" />
                        <button type="submit" class="btn btn-warning">
                            Absent
                        </button>
                    </form>
                @else
                    <form action="{{action('VolumesUserController@update',['id'=>$lu->id_volumes_user])}}" method="post">
                        <input type="hidden" name="_token" value="{{csrf_token()}}" />
                        <input type="hidden" name="_method" value="put" />
                        <button type="submit" class="btn btn-success">
                            Possede
                        </button>
                    </form>

                @endif

            </div>

        @endforeach
class VolumesUserController extends Controller {
            public function update($id)
            {
                if($users->read_volumes_user == 0){
                    DB::table(' volumes_user')
                        ->where('id_volumes_user', $users->id_volumes_user)
                        ->update(['read_volumes_user' => 1]);
                }elseif($users->read_volumes_user == 1){
                    DB::table('volumes_user')
                        ->where('id_volumes_user', $users->id_volumes_user)
                        ->update(['read_volumes_user' => 0]);
                }

                $id_manga= DB::table('volumes')
                    ->select('manga_id')
                    ->join('volumes_user', 'volumes_user.volumes_id', '=', 'volumes.id_Volume')
                    ->where('volumes_user.id_volumes_user', '=', $id)->first();

                //var_dump($id_volume->volumes_id); die;

                $volume=\App\Mangas::find($id_manga->manga_id)->volume;
                return view('volumes.index', compact('mangas'));
            }
}

Ce que je veux

Ca marche, mais j'ai l'impression qu'il existe plus simple comme solution, notamment pour mettre à jour l'attribut updated_at.

5 réponses


wesh poussin
Réponse acceptée

tu utilises laravel 5.5 ou 5.0 ?

la doc pour 5.5 est là : https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

Updating A Record On A Pivot Table

User::find(1)->roles()->updateExistingPivot($roleId, $attributes);

mais je pige pas pourquoi tu as besoin de faire ça : à quoi te sert d'ajouter un attribut sur la table pivot ? il suffit d'utiliser les fonctionnalités de base que fournit le framework pour une relation many to many : soit un utilisateur possède le volume (et la ligne avec leurs 2 ids existe dans la table pivot), soit pas...

si tu construits bien tes classes tu devrais être en mesure de le tester avec une méthode de la classe User du type :

public function hasVolume($volume)
{
    return $this->volumes->contains($volume);
}

en tout cas les attributs supplémentaire sur une table pivot c'est a priori plutôt pour une relation polymorphique et c'est pas le cas ici.

j'ai pas tout lu en détail mais a priori tu n'as quasi pas besoin de t'occuper de ta table pivot avec laravel, et encore moins de faire une classe pour ça ni de faire des requêtes via l'objet DB...

c'est une relation typique "many to many" (ou belongs to many), grafikart en parle là : https://www.youtube.com/watch?v=3lXZRGlKl_8

et la doc officielle là : https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

Zekura
Auteur

Imaginant que sur la table pivot, j'ai un attribut, comment je fais pour la changer sans passer par DB ?

Apparemment, il existe une fonction updateExistingPivot, mais je comprend pas son fonctionnement

lien : Lien

Zekura
Auteur

OK merci beaucoup ! Ca ma fais un déclic dans ma tête quand j'ai lu ton message !

Mais oui j'utilise Laravel 5.0 (Je travaille avec un livre et il est sur la version 5.0)

pas de quoi :)

j'ai un peu édité mon code.