Привет, я сталкиваюсь с проблемой с моей системой комментариев в laravel и ajax. На самом деле это работает только с php, но у меня проблемы с ajax.
Это сообщение об ошибке:
Код состояния: 500 Внутренняя ошибка сервера. И ошибка говорит: 1/3 SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Столбец «post_id» не может быть нулевым.
Я редактирую комментарии в модальном режиме, я могу создать новый комментарий, но проблема заключается в его редактировании с помощью ajax.
Код JS:
<script> var commentId = 0; var divcomment = null; $('.edit-comment').click(function(event){ event.preventDefault(); var divcomment = this.parentNode.parentNode; commentId = $("#comment-post", event.target.parentNode.parentNode).data('commentid'); var commentBody = $(divcomment).find('#display-comment').text(); $('#comment').val(commentBody); $('#edit-comment').modal(); }); $('#modal-save').click(function(){ $.ajax({ method: 'POST', url: urlEdit, data: { comment: $('#comment').val(), commentId: commentId, _token: token, _method: 'POST' } }) .done(function (msg){ $(divcomment).text(msg['new_comment']); $('#edit-comment').modal('hide'); }); }); </script>
Вот HTML:
<article class="row"> <div class="col-md-3 col-sm-3 hidden-xs"> <figure class="thumbnail"> <img class="img-responsive" src="/uploads/avatars/{{ $comment->user->profilepic }}" /> <figcaption class="text-center">{{ $comment->user->name }}</figcaption> </figure> </div> <div class="col-md-8 col-sm-8"> <div class="panel panel-default arrow left"> <div class="panel-body"> <header class="text-left"> <div class="comment-user"><i class="fa fa-user"></i> {{ $comment->user->name }}</div> <time class="comment-date" datetime="{{ $comment->created_at->diffForHumans() }}"><i class="fa fa-clock-o"></i> {{ $comment->created_at->diffForHumans() }}</time> </header> <div id="comment-post" data-commentid="{{ $comment->id }}"> <p id="display-comment">{{ $comment->comment }}</p> </div> </div> <div class="panel-footer list-inline comment-footer"> @if(Auth::guest()) No puedes responder ningún comentario si no has ingresado. @else @if(Auth::user() == $comment->user) <a href="#" data-toggle="modal" data-target="edit-comment" class="edit-comment">Editar</a> <a href="#" data-toggle="modal" data-target="delete-comment" class="delete-comment">Eliminar</a> @endif @if(Auth::user() != $comment->user) <a href="#">Responder</a> @endif @endif </div> </div> </div> </article>
Мое Редактирование:
<div class="modal fade" id="edit-comment" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> <h4 class="modal-title" style="color:#000;">Editar Comentario</h4> </div> <div class="modal-body"> <form> <div class="form-group"> <label for="comment">Editar comentario</label> <textarea class="form-control" name="comment" id="comment"></textarea> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn-comment-dismiss btn-comment-modal" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> Cerrar</button> <button type="button" class="btn-comment-edit btn-comment-modal" id="modal-save"><span class="glyphicon glyphicon-ok"></span> Editar</button> </div> </div> </div> </div>
Мои комментарии обновляют маршрут:
Route::POST('comments/', ['uses' => 'CommentsController@update', 'as' => 'comments.update']);
Моя функция обновления в CommentsController:
public function update(Request $request) { $this->validate($request, [ 'comment' => 'required' ]); $comment = Comment::find($request['commentId']); if (Auth::user() != $comment->user) { return redirect()->back(); } $comment->comment = $request['comment']; $comment->update(); return response()->json(['new_comment' => $comment->comment], 200); }
И, наконец, переменные, созданные на моем единственном представлении «где я показываю комментарии»,
<script> var token = '{{ Session::token() }}'; var urlEdit = '{{ url('comments/update') }}'; </script>
ОБНОВИТЬ:
Схема таблиц комментариев:
public function up() { Schema::create('comments', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id'); $table->text('comment'); $table->boolean('approved'); $table->integer('post_id')->unsigned(); $table->timestamps(); }); Schema::table('comments', function ($table){ $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); }); }
Новое обновление:
Сообщения об ошибках:
Ошибка 1/3
SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец «post_id» не может быть нулевым
Ошибка 2/3
SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец «post_id» не может быть нулевым
Ошибка 3/3
SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец «post_id» не может быть нулевым (SQL: вставить в
comments
(comment
,approved
,post_id
,user_id
,updated_at
,created_at
) значения (еще один комментарий, 1,, 4, 2017-06 -04 04:54:34, 2017-06-04 04:54:34))
Дополнительная информация:
Генеральная
Request URL:http://devmedia.dev/comments/update Request Method:POST Status Code:500 Internal Server Error Remote Address:127.0.0.1:80 Referrer Policy:no-referrer-when-downgrade
форма
comment:Another yet comment commentId:13 _token:Do1gqYfziHij1nAj2CFOWwgdt7UWuubqbawrD5uX _method:POST
Целые маршруты комментариев:
Route::post('comments/{post_id}', ['uses' => 'CommentsController@store', 'as' => 'comments.store']); Route::get('comments/{id}/edit', ['uses' => 'CommentsController@edit', 'as' => 'comments.edit']); Route::POST('comments/', ['uses' => 'CommentsController@update', 'as' => 'comments.update']); Route::delete('comments/{id}', ['uses' => 'CommentsController@destroy', 'as' => 'comments.destroy']); Route::get('comments/{id}/delete', ['uses' => 'CommentsController@delete', 'as' => 'comments.delete']);
Похоже, моя (и Антон ) догадка была правильной. У вас есть два противоречивых маршрута.
Route::post('comments/{post_id}', ['uses' => 'CommentsController@store', 'as' => 'comments.store']);
И, конечно же,
Route::post('comments/', ['uses' => 'CommentsController@update', 'as' => 'comments.update']);
Поскольку два маршрута используют примерно один и тот же маршрут, laravel просто идет по которому определяется первым, это ваш маршрут comment.store.
Есть несколько способов исправить это.
Измените порядок ваших маршрутов:
Route::post('comments/update', ['uses' => 'CommentsController@update', 'as' => 'comments.update']); Route::post('comments/{post_id}', ['uses' => 'CommentsController@store', 'as' => 'comments.store']); Route::get('comments/{id}/edit', ['uses' => 'CommentsController@edit', 'as' => 'comments.edit']);
Использовать ограничения маршрута:
Route::post('comments/{post_id}', [ 'uses' => 'CommentsController@store', 'as' => 'comments.store' ])->where(['post_id' => '[0-9]+']);; Route::get('comments/{id}/edit', ['uses' => 'CommentsController@edit', 'as' => 'comments.edit']); Route::post('comments/update', ['uses' => 'CommentsController@update', 'as' => 'comments.update']);
Следует отметить, что я не знаю, как регистратор Facade обрабатывает корпус (нижний, верхний) методов фасада. Поэтому, чтобы не создавать дополнительных ошибок, я использовал нижний кожух POST
, так же, как он используется в документация.