【问题标题】:Laravel create related Model view, pass prefilled valueLaravel 创建相关模型视图,传递预填充值
【发布时间】:2018-08-21 06:51:07
【问题描述】:

我正在实施一个包含许多模型和关系的后台系统。

现在我坚持我的 UI 策略: 假设我有房屋和房间。一屋多间。

我以“Laravel”的方式为这两个模型创建了控制器。(资源控制器)

所以我有他们两个的路线

example.com/backoffice/house

example.com/backoffice/room

我想要实现的东西听起来很简单:

我想在房子的详细视图中添加一个按钮(“为这所房子创建房间”),它将我重定向到“房间/创建”,但在创建视图中我想将“house_id”的值设置为 id我来自的房子。所以我可以正常使用 RoomController 中的 store 方法,然后重定向回房子。

我想要一个通用的方法,因为我必须在许多模型/视图上使用这个功能。我正在考虑一个会话变量,但我认为最终会有人更好地处理这种情况?还是 UI 处理的更好主意?

【问题讨论】:

    标签: laravel view relation


    【解决方案1】:

    显然,Laravel 删除了 5.6 版的一些很棒的文档,即 nested resource controllers

    你可以做的是使用嵌套路由。

    假设您当前的控制器设置如下:

    Route::resource('houses', 'HouseController');
    Route::resource('rooms', 'RoomController');
    

    如果将此部分更改为以下内容:

    Route::resource('houses', 'HouseController');
    Route::resource('houses.rooms', 'RoomController');
    

    这将每个房间与房子结合在一起,并且非常易于管理。它会为您提供类似 houses/4/rooms/create 的 URL,它会立即在您的 create 方法中为您提供 house_id

    public function create($houseId)
    {
        return view('houses.rooms.create', ['houseId' => $houseId]);
    }
    

    如果要编辑房间,完全一样:

    public function edit($houseId, $roomId)
    

    Laravel 5.1 documentation 仍然有这种技术的示例。

    【讨论】:

    • 哇,这似乎是个好主意。但是,如果我想管理所有房间,以便用户可以从索引视图中选择房间,并在不查看房屋的情况下对其进行编辑,该怎么办?如果我可以使用相同的控制器,我认为为一个模型定义两个或更多资源路由是可以接受的。 Route::resource('houses.rooms', 'RoomController'); Route::resource('rooms', 'RoomController'); public function create($houseId = null) { return view('rooms.create', ['houseId' => $houseId]); } 我想我会试试的。
    • 有点取决于您如何构建整个应用程序,但您可以为所有房间设置额外的路由 Route::get('manage_rooms', 'RoomController@allRooms')。
    【解决方案2】:

    为此,我会建议以下方式(可能还有其他方式)

    改变路线:

    Route::get('room/create/{house_id?},'Controller@action')->name('room.create')
    

    house_view.blade.php文件中添加<a>标签。

    <a href="{{route('room.create', ['house_id' => $houseModel->id])}}">Create Room for this House</a>
    

    房间控制器文件。

    public function formCreate($house_id)
     {
       return view('form.room_create', ['house_id' => $house_id]);
     }
    

    room_create.blade.php文件中添加类型隐藏&lt;input&gt;标签

    <input type="hidden" id="house_id" name="house_id" value="{{$house_id or ''}}">
    

    【讨论】:

    • 由于格式化而被否决。解决这个问题,提到我,我会删除它。
    • @DouwedeHaan 立即查看。 ;-)
    • 几乎 ;) 我只是稍微编辑了标题,所以它们没有以前那么大了!
    • 谢谢@DouwedeHaan,会纠正我自己的。新发帖.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2015-06-13
    相关资源
    最近更新 更多