Php 嵌套模型形式的关系-Laravel

Php 嵌套模型形式的关系-Laravel,php,ruby-on-rails,laravel,laravel-4,Php,Ruby On Rails,Laravel,Laravel 4,在laravel中,是否有某种方式将相关资源嵌套在表单中 假设我有这个: class Person extends Eloquent { public function addresses() { return $this->hasMany("Address"); } } class Address extends Eloquent { public function person() { return $this->belongsTo("Person"

在laravel中,是否有某种方式将相关资源嵌套在表单中

假设我有这个:

class Person extends Eloquent {
  public function addresses() {
    return $this->hasMany("Address");
  }
}

class Address extends Eloquent {
  public function person() {
    return $this->belongsTo("Person");
  }
}
我想要一张个人表格来收集关于那个人地址的信息。laravel是否以一种与Rails的accepts\u nested\u attributes\u for:address和fields\u for:address等效的方式促进了这一点

我只想做一些简单的事情,在那里我可以包括地址字段和Person表单的结果,因为地址实际上并不存在于Person之外。这有意义吗

==编辑==

这是假设代码

我要找的是类似这样的东西:

{{ Form::model(new Person, array("action" => "admin\PersonController@store", "method" => "POST")) }}

{{ Form::text("name", array(...)) // <input name='person[name]' ... /> }}


{{ Form::email("email", array(...)) // <input name='person[email]' ... /> }}

{{ Form::fields_for("addresses"/* Would be name of relation */) }}

  {{ Form::text("street_address") // <input name='person[addresses][][street_address]' ... /> }}

{{ Form::close_fields() }}

{{ Form::close() }}

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

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

您输入的名称正确无误

形式


现在,您可以使用包modelform为各种模型创建一个表单,甚至为关系创建一组表单


我不太清楚你到底在说什么。你是在把一个地址列表拉到表单上的一个选择框中还是什么?另一方面,在定义关系时,您几乎可以调用任何方法,但我会将“persons”命名为“person”,因为只有一个人属于一个地址,而不是多个地址。我希望在创建人的同时使用相同的表单创建一个地址。address::persons是一个拼写错误。菲克多克。这是有道理的。下一个问题可能很可笑,但有没有办法将地址传递给具有其他参数的Person,以保存实例化和关联新地址的按键?我在答案中写下了它,但后来我想:这是一种hasMany关系!。您可以这样做,但必须首先找到需要输出的地址。然后,传递第二个参数使其自动完成:{{Form::textfield_x,$person->address->field_x}您不必为新地址“生成一些随机键”,对吗?它只是一个空白,你发布的代码看起来可以很好地处理这个问题,除非你添加了多个地址。在这种情况下,您需要区分这两组字段。我想它最终会像$u文件一样。@CollinJames:我想在我的示例中为Event和Admin实现相同的功能,在这个示例中,一个事件可以分配给同一表单上的多个Admin Event create表单。但我无法从您的解决方案中理解我需要在事件控制器的Create方法中编写什么,因为在编写Event Create.blade.php视图中的代码后,我得到了一个错误,即未定义变量admins。您能否提供一个完整的示例,说明如何从父级的表创建表单中保存关联表的数据?此解决方案非常有效,但如果您希望用户能够创建或删除地址对象,该怎么办?
// Form open, Person fields, etc...

<h2>Addresses</h2>
@foreach ($addresses as $address)

    <fieldset>

        {{ 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) }}

    </fieldset>

@endforeach

// Form Close
// 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();
}