Не привязка к правильному идентификатору

#php #laravel

#php #laravel

Вопрос:

я новичок в коде и задаюсь вопросом, почему мой идентификатор комментария не связан с правильным идентификатором сообщения.

Это мой контроллер комментариев

 <?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppModelsTweet;
use AppModelsUser;
use AppModelsComment;



class CommentController extends Controller
{
    public function show()
    {
      return view('comments',[

      'tweets' => Tweet::all()
    ]);
    }
    public function store(Tweet $tweet)
    {


      $attributes = request()->validate(['comment_body' => 'required|max:255']);


          Comment::create([

        'user_id' => auth()->id(),
        'tweet_id' => $tweet->id,
        'comment_body' => $attributes['comment_body']
      ]);


      return redirect('/comments/{$tweet->id}');
    }
}
  

Это мой comment.blade.php файл

 
    x-app>
  <div class="border border-blue-400 rounded-lg px-8 py-6 mb-8">
{{dd($tweets)}}
 @foreach ($tweets as $tweet)
    <form method="POST" action="/comments/{{$tweet->id}}">
    @csrf
    @endforeach



    <textarea
      name="comment_body"
          class="w-full"
          placeholder="Reply to this tweet"
          required
          autofocus
           >
         </textarea>

           <hr class="my-4">

           <footer class="flex justify-between items-center">
             <img
             src="/images/twitter.jpg"
             alt=""
             class="mr-2 rounded-full"
             width="50"
             >


           <button type="submit" class="bg-blue-500 hover:bg-blue-600 rounded-lg shadow px-10 text-white h-10">Comment</button>
     </footer>
  </form>
  @error('body')
    <p class="text-red-500 text-sm mt-2">{{ $message }} </p>
  @enderror
  </div>
    <div class="border border-gray-300 rounded-lg">

  <p class="p-4">No comments</p>






  </div>


</x-app>
  

Основная проблема заключается в том, что я нажимаю комментарий и вместо того, чтобы вводить его в базу данных, как это должно быть, например, я комментирую твит с идентификатором 2 в базе данных, и комментарий будет иметь идентификатор твита 1, который предназначен для их связи, но вместо этого все комментарии будутидентификатор твита 1.

Комментарии:

1. ваш @endforeach должен быть перед </form> закрытием тега, иначе он создаст так много <form> тегов без какого-либо закрытия

Ответ №1:

Ваш метод контроллера ожидает модель «Tweet», а не $tweet->id , которую вы публикуете.

Вы можете подтвердить это, выполнив print_r on $tweet в методе store вашего контроллера.

 print_r($tweet);
  

Измените действие формы на

 <form method="POST" action="/comments/{{$tweet}}">
  

ЕСЛИ ВЫ НЕ ИСПОЛЬЗУЕТЕ МАРШРУТ РЕСУРСА

Ваш почтовый маршрут для этого действия должен быть настроен следующим образом:

 Route::post('/comments/{tweet}, 'CommentController@store');
  

Согласно комментарию ДжошБонника, тег открытия формы находится в вашем @foreach цикле в приведенном вами примере блейда, но закрытие — нет, вы, вероятно, захотите переместить свой @endforeach тег ниже закрывающего </form> тега

У вас также есть ошибка в вашем перенаправлении в контроллере, вам не нужны фигурные скобки {} вокруг {$tweet->id}

Комментарии:

1. Теги открытия формы также находятся внутри foreach цикла, а one один закрывающий тег находится вне этого цикла.

2. хорошо заметил @JoshBonnick — я включу это в свой ответ

3. Привет, спасибо за ваше время, но я изменил следующие вещи, как вы сказали, и теперь вместо этого я получаю это мой URL {«id»: 1,»user_id»:1,»body»:»a»,»created_at»:»2020-10-20T09:58:58.000000Z»,»updated_at»:»2020-10-20T09:58:58.000000Z»}

4. вы уверены, что используете метод post?

5. Маршрут:: post(«/ comments/{tweet}», «App Http Controllers CommentController @store»); это мой маршрут, мне пришлось изменить его, чтобы учесть мою версию laravel, которая является laravel 8

Ответ №2:

POST Метод не будет принимать идентификатор из действия. Вы можете использовать скрытое поле для идентификатора в форме.