在模型中嵌套模型关系 – Laravel
在laravel中,是否有某种方法可以在表单中嵌套相关资源?
说我有这个:
class Person extends Eloquent { public function addresses() { return $this->hasMany("Address"); } } class Address extends Eloquent { public function person() { return $this->belongsTo("Person"); } }
我想要一个Person
表单来收集有关该Person
Address
。 laravel是否以与Rails的accepts_nested_attributes_for :address
和fields_for :address
相同的方式为此提供了便利?
我只是喜欢简单的地方,我可以在Address
字段中包含Person
表单的结果,因为除了Person
之外, Address
并不存在。 这有意义吗?
==编辑==
这是假设的代码
我正在寻找的东西是这样的:
{{ Form::model(new Person, array("action" => "admin\PersonController@store", "method" => "POST")) }} {{ Form::text("name", array(...)) // }} {{ Form::email("email", array(...)) // }} {{ Form::fields_for("addresses"/* Would be name of relation */) }} {{ Form::text("street_address") // }} {{ Form::close_fields() }} {{ Form::close() }}
您在输入名称的正确轨道上。
形成
// Form open, Person fields, etc... Addresses
@foreach ($addresses as $address) @endforeach // Form Close
如果要添加地址,则需要生成一些随机密钥而不是地址ID。 这将保持字段分组。
控制器逻辑
这是我处理输入的方式,使用’fillable’来过滤进入模型的数据。
// Get the Person model, fill, save, etc... $addressIds = array(); foreach (Input::get('addresses', array()) as $id => $addressData) { $address = Address::find($id) ?: new Address; $address->fill($addressData); $address->save(); $addressIds[] = $address->id; } $changes = $person->addresses()->sync($addressIds); // Delete the unused addresses foreach ($changes['detached'] as $detachedAddressId) { $address = Address::find($detachedAddressId); if (!empty($address)) $address->delete(); }
现在,您可以使用“modelform”包为各种模型甚至一组关系forms创建表单。
您应该从控制器管理所有这些。 从表单中收集数据并根据需要使用它们:
// Controller Code $person = new Person(array( 'field_1' => Input::get('field_1'), 'field_2' => Input::get('field_2'), ............. )); $person->save(); $address = new Address(array( 'field_x' => Input::get('field_x'), 'field_y' => Input::get('field_y'), ............. )); $person->addresses()->save($address);
在文档中查看