Удаление записи Laravel влияет на порядок новых записей. - PullRequest
0 голосов
/ 30 апреля 2019

Я успешно могу удалить тикет и запись удаляется из базы данных.Если у меня есть два билета «Билет 1 и Билет 2», я с радостью могу удалить билет 1, потому что это ПЕРВЫЙ билет, и могу удалить билет 2, потому что это следующий билет после билета 1 (В любом порядке!)

ОднакоУ меня есть забавная старая проблема, когда если я не удаляю билеты в порядке убывания подряд

Возьмите эти билеты в качестве примера:

Билет 1 - Время, созданное в 10:00 Билет2 - Время, созданное в 10:15. Билет 3 - Время, созданное в 10: 30

Итак, если я удаляю билет 3 (потому что это был последний созданный билет), удалите билет 2, удалите билет 1 и вместо этого удалитеПо среднему билету «Билет 2» я получаю сообщение об ошибке при попытке создать другой билет.Новый тикет создается, однако поля «автор» и «организация» не заполняются, и когда я иду, чтобы открыть тикет, я получаю «Нет сообщения об ошибке» - тикет не удалось создать полностью.

Когда этот новый тикет создается с пустыми полями «автор» и «организация», а также с ошибкой «нет сообщения», идентификатор добавляется на единицу выше той, которая была первоначально под ним.Так, например, если я удаляю билет 2 с идентификатором 2 (оставляя только билеты с идентификаторами 1 и 3 слева), когда я создаю другой билет, он получает идентификатор 4, который является правильным, но в phpMyAdmin 4 показываетвыше 3 вместо того, чтобы быть после 3, конечно.Кроме того, атрибут 'slug' заявки с идентификатором '3' увеличивается до 'ticket-title-2 ", что также не должно происходить. Однако я не думаю, что это связано с приращением slug, поскольку без метода (как показано на рисунке)в модели тикетов) проблема все еще сохраняется.

Я также подумал, что это связано с методом удаления, который я использовал, поэтому попробовал $ ticket-> forceDelete () вместо $ ticket-> delete (),но это, похоже, не сработало. Я попытался обойти свой метод создания, но после многих часов отладки я все еще пытаюсь найти, где эта проблема идет не так. Однако я знаю, что проблема заключается в заказе билета.когда он удален, но где возникает эта проблема, я не знаю.

Маршрут

Route::delete('ticket/{ticket}', 'AdminController@delete')->name('admin.delete');

Билет - функция хранилища

public function store()
    {
        if (Auth::user()->organisation == "Bournemouth University") {
            $ticketCode = "BU";
        } else {
            $ticketCode = "NHS";
        }

        $attributes = request()->validate([
            'title' => ['required', 'min: 2'],
            'description' => ['required'],
            'subject_area' => ['required']
        ]);

        Ticket::create($attributes);
        $slug = str_slug(Ticket::get()->last()->title, '-');

        Ticket::get()->last()->update(['code' => $ticketCode, 'user_id' => Auth::user()->id, 'slug' => $slug, 'author' => Auth::user()->username]);

        $slug = Ticket::get()->last()->slug;

        return redirect()->route('ticket.show', $slug);
    }

Контроллер администратора - метод удаления

public function delete(Ticket $ticket){
        $ticket->delete();
        return redirect('/');
    }

Страница тикета - форма удаления

<div class="modal fade" id="delete" tabindex="-1" role="dialog">
                            <div class="modal-dialog" role="document">
                                <div class="modal-content">
                                    <div class="modal-header">
                                        <h4>Are you sure you want to delete this post?</h4>
                                    </div>
                                    <div class="modal-body">
                                        <form id="delete-post" method="POST" action="{{route('admin.delete', $slug->slug) }}">
                                            @csrf
                                            @method('DELETE')
                                            <div style="text-align: center">
                                                <button type="submit" class="btn btn-success"
                                                        id="confirm-del" data-dismiss="modal"
                                                        style="font-weight: bold;">Yes
                                                </button>
                                                <button type="button" class="btn btn-danger" data-dismiss="modal"
                                                        style="font-weight: bold;">No
                                                </button>
                                            </div>
                                        </form>
                                        <script type="text/javascript">
                                            $(function(){
                                                $('#confirm-del').on('click', function(){
                                                    $('#delete-post').submit();
                                                });
                                            });
                                        </script>
                                    </div>
                                </div>
                            </div>
                        </div>

Модель тикета - методы увеличения порции

 public function setSlugAttribute($value){
        if(static::whereSlug($slug = str_slug($value))->exists()){
            $slug = $this->incrementSlug($slug);
        }

        $this->attributes['slug'] = $slug;
    }

    public function incrementSlug($slug){
        $firstSlug = $slug;
        $count = 2;

        while(static::whereSlug($slug)->exists()){
            $slug = "{$firstSlug}-" . $count++;
        }
        return $slug;
    }

Извинения, если я совершенно неясен. Я надеюсь, что кто-то можетточкаменя в правильном направлении, где я могу идти не так или как исправить эту проблему.

1 Ответ

1 голос
/ 30 апреля 2019

Не знаю, решит ли это вашу проблему, но каждый раз, когда вы пишете

Ticket::get()->last()

Вы делаете большой запрос к базе данных. Действительно, это переводится как «принеси мне все результаты, а в тех результатах, которые ты получил, достань мне последний». Если вы хотите получить самую последнюю версию (по порядку созданного_атериала), вы можете использовать:

Ticket::latest()->first()

Но тогда это также один запрос каждый раз, когда вы его вызываете.

По нескольким причинам (включая параллелизм, скорость, ремонтопригодность) я бы предложил сделать все это за один раз:

public function store()
{
    if (Auth::user()->organisation == "Bournemouth University") {
        $ticketCode = "BU";
    } else {
        $ticketCode = "NHS";
    }

    $attributes = request()->validate([
        'title' => ['required', 'min: 2'],
        'description' => ['required'],
        'subject_area' => ['required']
    ]);

    // Now, populate the attributes before creating the ticket.
    $attributes['slug'] = str_slug(Ticket::get()->last()->title, '-');
    $attributes['code'] = $ticketCode;
    $attributes['user_id'] = Auth::user()->id;
    $attributes['author'] = Auth::user()->username;

    $ticket = Ticket::create($attributes);

    // And we get the slug directly from the ticket
    return redirect()->route('ticket.show', $ticket->slug);
}

PS: Еще больше улучшений в этом коде:

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