php - many - wherepivot laravel
Nesting Models Relations In Forms-Laravel (3)
Ahora puede usar el paquete "modelform" para crear un formulario para varios modelos o incluso un conjunto de formularios para las relaciones.
En laravel, ¿hay alguna manera de anidar recursos relacionados en una forma?
Digamos que tengo esto:
class Person extends Eloquent {
public function addresses() {
return $this->hasMany("Address");
}
}
class Address extends Eloquent {
public function person() {
return $this->belongsTo("Person");
}
}
y quiero que un formulario de Person
recopile información sobre la dirección de esa Person
. ¿Facilita laravel esto de una manera que sea equivalente a los accepts_nested_attributes_for :address
y fields_for :address
?
Me gustaría algo simple donde pueda incluir los campos Address
con los resultados del formulario Person
, ya que la Address
no existe realmente aparte de la Person
. ¿Esto tiene sentido?
== EDITAR ==
Este es un código hipotético
Lo que estoy buscando es algo que se parecería a esto:
{{ 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() }}
Debe gestionar todo esto desde su controlador. Reúna los datos del formulario y úselos como desee:
// 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);
Estás en el camino correcto con los nombres de entrada.
Formar
// 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
Si desea agregar direcciones, deberá generar alguna clave aleatoria para usar en lugar de la id de la dirección. Esto mantendrá los campos agrupados.
Lógica del controlador
Así es como manejaría la entrada, usando ''rellenable'' para filtrar los datos que entran en los modelos.
// 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();
}