重新排序菜单项而不影响数据库ID

时间:2016-05-19 15:54:13

标签: laravel laravel-5.2

我的Laravel应用程序中有一个列出标签的菜单。我希望能够添加更多标签并更改其顺序,但我不想影响每个标签的基础数据库ID。因为这会破坏我已经与之关联的任何数据。所以我想我在我的数据库中添加了一个名为' display_order'像这样:

数据库:

Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('display_order');
            $table->string('name');
            $table->timestamps();
 });

现在我想创建一个视图,让用户更改display_order字段的值。最初我展示了一个打印每个标签及其display_order的页面,并允许用户更新文本字段中的值:

控制器:

public function showTagsOrder()
{
    $tags = Tag::all()->sortBy('display_order');
    return view('menu.tags', compact('tags'));
}

路线:

Route::get('/menu/tags', ['as' => 'menu_tags', 'uses' => 'MenuOrderController@showTagsOrder']);

查看:

{!! Form::open(['action' => 'MenuOrderController@updateTagsOrder']) !!}
            @foreach($tags->chunk(18) as $chunk)
                <div class="col">
                    @foreach($chunk as $tag)
                        <p><label>{!! $tag->name !!}</label><input type="text" name="tag_array[{!! $tag->id !!}]" value="{!! $tag->display_order !!}" class="numeric" />
                    @endforeach
                </div>
            @endforeach
        <p>{!! Form::submit('Submit') !!}
{!! Form::close() !!}

提交表单后,我的控制器中有以下功能:

public function updateTagsOrder(TagsMenuRequest $request)
{

        $i = 1;
        foreach($request->tag_array as $tag_value)
        {
            $tag = new Tag; 
            $tag = Tag::find($i);
            $tag->display_order = $tag_value;
            $tag->save();
            $i++;
        }
        flash()->overlay('The order of tags in the menu has been udpated!', 'Congratulations');
        return redirect('/');
}

但这不起作用。我如何重写这个,所以我为每个标签分配了display_order的正确值。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

    foreach($request->tag_array as $tag_id => $tag_value)
    {
        $tag = Tag::find($tag_id);
        $tag->display_order = $tag_value;
        $tag->save();
    }