【问题标题】:Nesting Models Relations In Forms - Laravel在表单中嵌套模型关系 - Laravel
【发布时间】:2014-01-08 05:06:01
【问题描述】:

在laravel中,有没有办法在表单中嵌套相关资源?

说我有这个:

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

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

我想要一个Person 表单来收集有关PersonAddresses 的信息。 laravel 是否以类似于 Rails 的 accepts_nested_attributes_for :addressfields_for :address 的方式促进这一点?

我想要一些简单的东西,我可以在Person 表单的结果中包含Address 字段,因为除了Person 之外,Address 并不真正存在。这有意义吗?

== 编辑 ==

这是假设代码

我正在寻找类似于这样的东西:

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

【问题讨论】:

  • 不太清楚你在这里得到了什么。您是在将地址列表拉入表单或其他内容的选择框之后吗?另一方面,虽然您在定义关系时几乎可以调用任何方法,但我会将“人”命名为“人”,因为只有一个人属于一个地址,而不是多个人。
  • 我想在创建 Person 的同时创建一个地址,使用相同的表单。
  • Address::persons 是一个错字。固定

标签: php ruby-on-rails laravel laravel-4


【解决方案1】:

您应该通过控制器管理所有这些。从表格中收集数据并随意使用:

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

See it in the docs

【讨论】:

  • 好的。这是有道理的。下一个问题可能很荒谬,但是有没有办法将Address 与其他参数一起传递给Person,以节省实例化和关联新Address 的击键?
  • 我在答案中写了它,但后来我想:“这是hasMany() 关系!”。你可以这样做,但你必须先找到你需要输出的地址。然后,传递第二个参数使其自动完成:{{ Form::text("field_x", $person-&gt;address-&gt;field_x)}}
【解决方案2】:

您在输入名称的正确轨道上。

表格

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

如果你想添加地址,你需要生成一些随机密钥来代替地址 ID。这将使字段保持分组。

控制器逻辑

这就是我处理输入的方式,使用“可填充”来过滤进入模型的数据。

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

【讨论】:

  • 不过,您不必为新地址“生成一些随机密钥”,对吧?它只是空白,您发布的代码看起来可以处理得很好。
  • 除非您添加了多个地址。在这种情况下,您需要区分这两组字段。
  • 嗯。我认为它最终会像$_FILES
  • @CollinJames:我想为事件和管理员(在我的示例中)实现相同的功能,其中一个事件可以在同一个表单(事件创建表单)上分配给多个管理员。但我无法从您的解决方案中理解我需要在事件控制器的 Create 方法中编写什么,因为在事件视图“create.blade.php”中编写代码后,我收到错误“未定义的变量管理员”。您能否提供一个完整的示例,规定从父表创建表单中保存关联表的数据?
  • 这个解决方案效果很好,但是如果您希望用户能够创建或删除地址对象怎么办?
【解决方案3】:

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

https://github.com/andersondanilo/modelform

【讨论】:

    猜你喜欢
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2016-09-26
    • 2014-10-27
    相关资源
    最近更新 更多