Форма Laravel принимает неверный идентификатор записи для удаления - PullRequest
0 голосов
/ 10 июня 2018

У меня есть две кнопки (редактировать и удалять) в индексном представлении, где я могу правильно редактировать запись, но когда я удаляю запись, форма laravel принимает идентификатор другой записи для удаления.

Это представление:

<div class="row">
                    @if(App\Player::count()>0)
                      @foreach($players as $player)
                        <div class="col-lg-3 col-md-6">
                            <div class="thumbnail no-padding">
                                <div class="thumb">
                                    <img src="/cricket/storage/images/players/{{ $player->photo }}" alt="">
                                    <div class="caption-overflow">
                                        <span>
                                            <a href="/cricket/storage/images/players/{{ $player->photo }}" class="btn bg-success-400 btn-icon btn-xs" data-popup="lightbox"><i class="icon-plus2"></i></a>
                                            <a href="user_pages_profile.html" class="btn bg-success-400 btn-icon btn-xs"><i class="icon-link"></i></a>
                                        </span>
                                    </div>
                                </div>

                                <div class="caption text-center">
                                    <h6 class="text-semibold no-margin">{{ $player->name }}</h6>
                                    <ul class="icons-list mt-15">

                                        <li><a href="{{ route('players.edit', $player->id) }}" data-popup="tooltip" title="Edit" data-container="body"><i class="fa fa-pencil"></i></a></li>
                                        <li></li><li></li><li></li>

                                        <li>

                                        {!! Form::open(['id' => 'p', 'method' => 'DELETE', 'route' => ['players.destroy', $player->id]]) !!}

                                        <a href="javascript:{}" onclick="document.getElementById('p').submit();" data-popup="tooltip" title="Delete" data-container="body"><i class="fa fa-trash"></i></a>

                                        {!! Form::close() !!}
                                        </li>

                                    </ul>
                                </div>
                            </div>
                        </div>
                    @endforeach
                  @endif

                </div>  

Это метод удаления:

public function destroy($id)
{

    $record = Player::find($id);
    $filename = $record->photo;   

    if(Storage::exists('players/' . $filename))
    {
        Storage::delete($filename);
        //return "yyy";
    }

    $record->delete();

    Session::flash('success', 'The record was successfully deleted.');

    return redirect()->route('players.index');
}  

Я добавил текстовое поле и отобразил идентификатор записи, в которой он показываетправильный идентификатор, как показано на скриншоте ниже, но когда я отправляю форму для удаления, он принимает неправильный идентификатор:
ID 9

Когда я отображаю идентификатор из метода удаления, он показывает 5вместо 9:

public function destroy($id)
{

    return $id;
}  

Приведенный выше код возвращает 5, что неверно, он должен вернуть 9, ниже приведен результат оператора return:

ID 5

Я не знаю, что здесь не так.
Любая помощь приветствуется заранее.

Ответы [ 4 ]

0 голосов
/ 21 июня 2019

Убедитесь, что 'p' является уникальной записью foreach.Вы можете добиться этого, связав с ним идентификатор игрока.

@foreach($players as $player)
    {!! Form::open(['id{{$player->id}}' => 'p', 'method' => 'DELETE', 'route' => ['players.destroy', $player->id]]) !!}
    <a href="javascript:{}" onclick="document.getElementById('p{{$player->id}}').submit();" data-popup="tooltip" title="Delete" data-container="body"><i class="fa fa-trash"></i></a>
    {!! Form::close() !!}
@endforeach
0 голосов
/ 11 июня 2018

Я думаю, что проблема в вашем html / javascript.Генерация форм в основном выглядит следующим образом, если вы упростите ее:

@foreach($players as $player)
    {!! Form::open(['id' => 'p', 'method' => 'DELETE', 'route' => ['players.destroy', $player->id]]) !!}
    <a href="javascript:{}" onclick="document.getElementById('p').submit();" data-popup="tooltip" title="Delete" data-container="body"><i class="fa fa-trash"></i></a>
    {!! Form::close() !!}
@endforeach

Каждая форма игрока получает один и тот же идентификатор ("p"), поскольку вы генерируете форму внутри цикла foreach.Я думаю, что происходит то, что javascript просто выбирает первую форму, а не ту, которую вы пытаетесь отправить, потому что ваш идентификатор больше не является уникальным.

Возможное решение - добавить какой-нибудь перечислительк идентификатору формы (например, p-{{ $player->id }}) или найдите другой способ выбора правильной формы для отправки, например, найдите родительскую форму кнопки.

0 голосов
/ 02 апреля 2019
{!! Form::open(['class' => 'p', 'method' => 'DELETE', 'route' => ['players.destroy', $player->id]]) !!}

У меня были те же проблемы, но после изменения идентификатора класса он работает

0 голосов
/ 11 июня 2018

Ваши коды выглядят хорошо,

Можете ли вы попробовать удалить запись по запросу, как этот,

$record = Player::where('id', $id)->first();
...
$record->delete();

Я надеюсь, что это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...