В 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
этого Person
. Поддерживает ли laravel это таким образом, который эквивалентен Rails ' accepts_nested_attributes_for :address
и fields_for :address
?
Мне просто нужно что-то простое, где я могу включить поля Address
с результатами формы Person
, так как Address
действительно не существует отдельно от Person
. Имеет ли это смысл?
== EDIT ==
Это гипотетический код
То, что я ищу, – это нечто похожее на это:
{{ 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() }}
Вы находитесь на правильном пути с именами ввода.
форма
// 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
Если вы хотите добавить адреса, вам нужно создать случайный ключ для использования вместо идентификатора адреса. Это позволит сгруппировать поля.
Логика контроллера
Вот как я мог бы обрабатывать ввод, используя «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» для создания формы для разных моделей или даже набора форм для отношений.
Вы должны управлять всем этим от своего контроллера. Соберите данные из формы и используйте их, как вам угодно:
// 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);
См. Его в документах