За последние 24 часа нас посетили 21966 программистов и 1103 робота. Сейчас ищут 739 программистов ...

Удаление данных

Тема в разделе "Laravel", создана пользователем lordconst, 29 мар 2020.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    разобрался с проблемой, прошу удалить тему)
     
    #1 lordconst, 29 мар 2020
    Последнее редактирование: 29 мар 2020
  2. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    А, нет, оказывается ошибка. Некоторые посты успешно удаляются, а некоторые нет: Call to a member function delete() on null
    Странно очень, в чем дело? Погуглил, но толком ничего не понял, потому что сбивает еще вот что: к примеру, нахожусь здесь /show/13, после кнопки удалить переходит в /2, то есть с другим id. Кроме этого, видел примеры, где спрашивают почему в принципе не работает, а у меня сработало с одним объявлением один раз, а остальные удалять не хочет
    Маршрут:
    PHP:
    1. Route::delete('room/{id}', 'RoomController@destroy')->name('room.destroy');
    Форма:
    HTML:
    1. <form action="{{ route('room.destroy', ['id'=>$room->id]) }}" method="post"
    2.                           onsubmit="if(confirm('Точно удалить объявление?')) { return true } else return false">
    3.                         @csrf
    4.                         @method('DELETE')
    5.                         <input type="submit" class="btn btn-outline-danger" value="Удалить">
    6.                     </form>
    Контроллер:
    PHP:
    1. public function destroy($id)
    2.     {
    3.         $room = Room::find($id);
    4.         $room->delete();
    5.  
    6.         return redirect()->route('room.index')->with('success', 'Объявление успешно удалено!');
    7.     }
    p.s. попробовал изменить find на findorFail, вылезает ошибка 404 и в адресной строке /room/2, хотя до нажатия на кнопку я находился на /room/show/6, опять же другой id. Почему так происходит?
     
    #2 lordconst, 29 мар 2020
    Последнее редактирование: 29 мар 2020
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Кстати, вот еще что. Попробовал сделать так, чтобы нельзя было совершать действия с объявлением, автором которого пользователь не является. Добавил в метод update такую строчку:
    PHP:
    1. if ($room->person_id != \Auth::user()->id) {
    2.             return redirect()->route('room.index')->withErrors('Вы не можете редактировать чужое объявление');
    3.         }
    У меня есть догадка. Возможно, это из-за того, что у меня таблица people не связана с таблицей users (кроме как внешним ключом); то есть \Auth::user пытается соединиться с таблицей users, а у меня $room->person_id относится к таблице rooms, а поле person_id там внешний ключ от таблицы people (см. вложение).
    Как это безболезненно исправить? Потому что вылезает ошибка, что я не являюсь автором данного объявления
     

    Вложения:

  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Чудес не бывает, значит каким-то образом логическая ошибка в программе приводит к тому, что в $room->id появляется не тот идентификатор. Такое бывает, когда перемудришь с джоинами. Решение - в запросе с join-ами указать select так, чтобы id из других таблиц не закрывали id из главной
    --- Добавлено ---
    А ты связи Laravel используешь в принципе? Или пишешь всё прямо на запросах?
     
  5. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    а со связями будет легче? я думал о них, но пока не пробовал
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Если разберёшься внимательно по документации, как работают.