Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel删除记录会影响新记录的顺序_Laravel_Eloquent_Record - Fatal编程技术网

Laravel删除记录会影响新记录的顺序

Laravel删除记录会影响新记录的顺序,laravel,eloquent,record,Laravel,Eloquent,Record,我成功地删除了一张票证,并将记录从数据库中删除。如果我有两张票,票1和票2,我可以很高兴地删除票1,因为它是第一张票,可以删除票2,因为它是票1之后的下一张票 然而,我有一个有趣的老问题,如果我不按连续降序删除票据 以这些门票为例: 票证1-创建时间为10:00 票证2-创建时间为10:15 票证3-创建时间为10:30 因此,如果我删除票证3,因为这是上次创建的票证,请删除票证2,删除票证1,然后删除中间的票证“票证2”,那么在尝试创建另一个票证时,我会收到一个错误。创建了新票证,但未填充“作

我成功地删除了一张票证,并将记录从数据库中删除。如果我有两张票,票1和票2,我可以很高兴地删除票1,因为它是第一张票,可以删除票2,因为它是票1之后的下一张票

然而,我有一个有趣的老问题,如果我不按连续降序删除票据

以这些门票为例:

票证1-创建时间为10:00 票证2-创建时间为10:15 票证3-创建时间为10:30

因此,如果我删除票证3,因为这是上次创建的票证,请删除票证2,删除票证1,然后删除中间的票证“票证2”,那么在尝试创建另一个票证时,我会收到一个错误。创建了新票证,但未填充“作者”和“组织”字段,当我打开票证时,会收到“无消息错误”-因为票证未能完全创建

当使用空的“author”和“organization”字段以及“no message”laravel错误创建此新票证时,该ID将被添加到原来位于其下方的ID之上。例如,如果我删除id为2的票证2,只剩下id为1和3的票证,当我创建另一个票证时,它会收到一个id为4的正确票证,但在phpMyAdmin中,4显示在3的上方,而不是在3之后。ID为“3”的票证的“slug”属性也会增加到“ticket-title-2”,这也不应该发生。然而,我认为这与slug增量无关,因为如果没有ticket模型中所示的方法,问题仍然存在

我还认为这与我正在使用的删除方法有关,所以尝试了$ticket->forceDelete而不是$ticket->delete,但这似乎不起作用。我试着检查一下我的create方法,但是经过几个小时的调试,我仍然在努力找出这个问题出在哪里。不过,我确实知道问题是与删除车票时的订购有关,但我不知道这个问题是在哪里触发的

路线

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>


如果我不太清楚,我道歉。我希望有人能给我指出正确的方向,指出我可能会出错的地方,或者如何纠正这个问题。

我不知道这是否解决了你的问题,但每次你写信时

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);
}
附言: 对该代码的更多改进可以是:

使用事件来设置slug,而不是mutators。 使用用户和票据之间的关系并删除用户名字段。
你能把你的机票型号寄出去吗。你在使用软件吗?phpMyAdmin是否按特定字段对表进行排序,从而导致记录在创建时位于顶部?
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);
}