在模型中嵌套模型关系 – 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 :addressfields_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)
{{ Input::text('addresses['.$address->id.'][address_1]', $address->address_1) }} {{ Input::text('addresses['.$address->id.'][address_1]', $address->address_2) }} {{ Input::text('addresses['.$address->id.'][city]', $address->city) }} {{ Input::text('addresses['.$address->id.'][state]', $address->state) }} {{ Input::text('addresses['.$address->id.'][zip]', $address->zip) }}
@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创建表单。

https://github.com/andersondanilo/modelform

您应该从控制器管理所有这些。 从表单中收集数据并根据需要使用它们:

 // 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); 

在文档中查看