【问题标题】:Binding multiple form model to edit in laravel绑定多个表单模型以在 laravel 中进行编辑
【发布时间】:2023-12-16 12:21:01
【问题描述】:

我是 laravel 的新手。可能是问题与问题不匹配。问题是这样的。我有一对多的数据库表,比如酒店和房间。一间酒店可以有多个房间。我的目标是:

 public function edit($id) {
    echo $id;
    // get the hotel
    $data['hotel'] = Hotel::find($id);
    $data['rooms'] = Room::where("hotelId", $id)->get();

    // show the edit form and pass the hotel
    return view('include.middle')->nest('main', 'hotel.edithotel', $data);
}

我正在从房间和酒店的桌子上获取数据。毫无疑问,可以有多个房间。

在视图中。我想获取所有数据以编辑酒店和房间。

editHotel.blade.php

 //for hotel
 {{ Form::model($hotel, array('route' => array('hotel.update', $hotel->hotelId), 'method' => 'PUT')) }}

 //for room.  I want to run this in loop so that I can get data to edit for multiple rooms.
 {{ Form::model($rooms, array('route' => array('room.update', $rooms->roomId), 'method' => 'PUT')) }}

但我收到错误

 Undefined property: Illuminate\Database\Eloquent\Collection::$roomId (View: /Users/apple/hotelbooking/resources/views/hotel/edithotel.blade.php)

我已经在房间和酒店模型中设置了主键。

数据库架构。

  Hotel
  hotelId  | name             | address
  1        | example hotel       somewhere

  Room
  roomId   | hotelId   |  name  | price 
  1           1           Delux    $300
  2           1           Economy  $100

【问题讨论】:

  • 您可以发布您的表格方案。
  • 好的。我将编辑问题。
  • 您已经找到解决方案了吗?
  • 还没有。我想我应该从这个问题开始赏金。

标签: php laravel-5.2 laravel-blade


【解决方案1】:

主键没有问题,laravel 也没有问题。 问题在于,就像 laravel 所说的那样,您正试图从 COLLECTION 中获取未定义的属性。

集合是 Laravel 对象,它在某种程度上类似于数组(您可以阅读更多 here 以了解集合)

现在要解决你的问题,你唯一需要做的就是把

{{ Form::model($rooms, array('route' => array('room.update', $rooms->roomId), 'method' => 'PUT')) }}

在 foreach 循环中。

@foreach($rooms as $room)
{{ Form::model($room, array('route' => array('room.update', $room->roomId), 'method' => 'PUT')) }}
@endforeach

这样您将使用 object 而不是 collection

【讨论】:

  • 嗨,现在它抛出这个错误 'App\Room::update() 的声明应该与 Illuminate\Database\Eloquent\Model::update(array $attributes = Array, array $options = 数组)'
  • 它会抛出错误,因为路由也在循环中。如何处理。有没有其他选择。
  • 我认为它出现的第一个错误是因为您已经为 Room 模型实现了 update() 方法。如果你有的话重命名它并且在命名函数和方法时要小心第二个我会这样 {{ Form::open(array('route' => array('room.update', $room->roomId) , 'method' => 'PUT') }} @froeach($room as $r) //无论你想要什么,例如文本 Form::text($r->attr) @endforeach {{ Form::close( ) }}
  • room 是前面所说的集合。无法以这种方式将 id 分配给路由。我认为不可能做我想做的事。
  • * 不是这样,您可以发布问题并解决整个项目。这是 sobyou 发布一些代码并找出问题所在。在您的代码中,那部分是错误的。