Вопрос по javascript + laravel 8

У меня есть задача, есть список с людьми, у каждого из них есть SVG для добавление в избранное.

В контроллере есть метод с добавлением в избранное:

 public function addToFavorites(FavoriteTrainerRequest $request)
    {

        //get data from form
        $trainerId = $request->get('trainerId');


        //Authenticated user
        $user = auth()->user();

        //get data about favorites
        $favoriteTrainers = FavoriteTrainer::where('user_id', '=', $user->id)
            ->where('trainer_id', '=', $trainerId)
            ->first();


        //checking for data in the database
        //if empty - add
        if ($favoriteTrainers == null)
        {
            $user->favoriteTrainers()->attach($trainerId);
        }
        //if there is, delete
        else
        {
            $user->favoriteTrainers()->detach($trainerId);
        }




        return response()->json([
            вот тут мне нужно передать параметр, который будет иметь значение true/false - но что-то я вообще не понимаю как это правильно реализовать.


            ]);



    }

Делал тестовую форму с input:

    <form action="{{route('favorite')}}" method="post">
        @csrf
    <input type="text" name="trainerId" placeholder="Избранное"><br><br>
        <input type="submit" value="тык">
        @if($errors->any())
                <div>
                    <ul>
                        @foreach($errors->all() as $error)
                            <li>
                                {{$error}}
                            </li>
                        @endforeach
                    </ul>
                </div>
        @endif

    </form>

т.е,в форму добавляешь id в форму и он сразу уходит в pivot-таблицу. добавляешь снова - удаляется.

Потом, мне нужно было, чтобы при клике на svg происходило то же самое, только с подключением js.

вот вьюха:


            <div class="w-2/3 ml-5 flex flex-col justify-center items-center" id="trainers-block" data-add-trainer-to-favorite-list-url="{{route('favorite')}}">

                @foreach($trainers as $trainer)
                    <div class="flex items-center mt-5">
                        <span class="text-green-gym border-2 px-4 py-3.5 text-center"><span class="text-3xl">{{$trainer->trainer_points}}</span> <br> баллов</span>
                        <div class="text-sm border-2 py-3 ml-2 pl-10 w-widtable">
                            <div>
                                <div class="flex justify-between">
                                    <h4 class="text-base uppercase"><a href="{{route('trainer.show',['trainer' => $trainer->slug])}}">{{$trainer->surname.' '.$trainer->name}}</a></h4>
                                    <span class="pr-2 favorite-trainer-flag">
                                        <svg xmlns="http://www.w3.org/2000/svg" data-trainer-id="{{$trainer->id}}" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"></path></svg>

                                    </span>
                                </div>

вот js - совсем новое для меня, но я пытался:

        document.addEventListener("DOMContentLoaded", function() {

            let addToFavoriteListButtons = document.querySelectorAll('.favorite-trainer-flag')

            addToFavoriteListButtons.forEach(function(element) {
                element.addEventListener('click', async function (event) {
                    const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

                    let clickedButton = event.target
                    let trainerId = clickedButton.dataset.trainerId



                    let trainersBlock = document.getElementById('trainers-block')
                    let addTrainerToFavoriteListUrl = trainersBlock.dataset.addTrainerToFavoriteListUrl



                    try {
                        const response = await fetch(addTrainerToFavoriteListUrl, {
                            method:'POST',
                            headers: {
                                'X-CSRF-TOKEN': token
                            },
                            body: {
                                trainerId:trainerId
                            }
                        })
                        if(response.status == 200){
                            const responseData = await response.json();
                        } else {
                            alert('Что-то пошло не так. Перезагрузите страницу и попробуйте еще раз');
                        }


                    } catch (error) {
                        console.log(error);
                        alert('Что-то пошло не так. Перезагрузите страницу и попробуйте еще раз');
                    }



                })
            })
         });

Но в итоге, fetch - запрос не работает так как нужно, поэтому большая просьба к гуру, ребят помогите/ подскажите/ направьте, сижу уже 3ий день с этой байдой - решить не могу.

Я новичок во всем этом, но очень стараюсь разобраться :)


Ответы (1 шт):

Автор решения: Kabal

Проблему решил, изменив в html коде. Было:

                                        <svg xmlns="http://www.w3.org/2000/svg" data-trainer-id="{{$trainer->id}}" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"></path></svg>

                                    </span>
   
    ```
НА:
<span class="pr-2 favorite-trainer-flag" data-trainer-id="{{$trainer->id}}">
                                        <svg xmlns="http://www.w3.org/2000/svg"  width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"></path></svg>
                                    </span>

и в методе контроллера сделал:

 if (is_null($favoriteTrainers))
        {
            $user->favoriteTrainers()->attach($trainerId);
            $addedToFavorites = true;
        }
        //if there is, delete
        else
        {
            $user->favoriteTrainers()->detach($trainerId);
            $addedToFavorites = false;
        }



        return response()->json([
            'status' => 'success',
            'addedToFavorites' => $addedToFavorites

Может, кому пригодится :)

→ Ссылка