2013-06-01 19 views
23

Ich habe über diese Funktion zu lesen: http://laravel.com/docs/html#form-model-bindingLaravel Form Modell Bindung

Und es sieht wirklich nett, aber es gibt einige Dinge, die ich über nicht sicher bin.

Muss ich Code in die Controller-Aktion eingeben, um dieses Formular zu verarbeiten? Wie sieht das aus?

Das Modell (Benutzer), das ich in meinem Formular binden möchte, hat eine separate Tabelle für Adressen. Daher möchte ich die Felder des Benutzermodells, aber auch die Felder für das zugehörige Adressmodell ausfüllen können. Kann ich das mit Form-Model-Binding machen, oder muss ich das Formular manuell bearbeiten?

Oder, wenn das nicht gelingt, kann ich Formularmodellbindung für die Benutzerfelder verwenden, aber manuell die Adressfelder behandeln?

Antwort

41

Sie benötigen keinen anderen Code in Ihrem Controller, um dieses Formular zu verarbeiten. Alle Ihre (benannten) Formularvariablen werden in Input :: all() stehen.

Das Modell ($ user) übergeben Sie in

Form::model($user, array('route' => array('user.update', $user->id))) 

Ist irgendein Datensatz, den Sie müssen, wenn Sie mehr als eine Tabelle beteiligt haben, werden Sie etwas wie

$user = User::where('id',$userID) 
      ->leftJoin('users_addresses', 'users_addresses.user_id', '=', 'users.id') 
      ->first(); 
zu tun haben

Und übergeben Sie dieses zusammengesetzte Modell an Ihr Form :: model().

Wie Sie Ihre Eingaben benennen, liegt ganz bei Ihnen, weil Sie die Logik schreiben müssen, um Ihr Formular zu verarbeiten. Aber meiner Meinung nach users_address[street] für die Adresseingänge ist gut, weil Sie am Ende mit einem Array von Adressen Spalten, die Sie sofort an Ihr UserAddress-Modell übergeben können.

<html> 
    <head> 
     <title></title> 
    </head> 
    <body> 
     {{ Form::model($user, array('route' => array('user.update', $user->id))) }} 
      {{ Form::label('first_name', 'First Name:', array('class' => 'address')) }} 
      {{ Form::text('first_name') }} 

      {{ Form::label('last_name', 'Last Name:', array('class' => 'address')) }} 
      {{ Form::text('last_name') }} 

      {{ Form::label('email', 'E-Mail Address', array('class' => 'address')) }} 
      {{ Form::text('email') }} 

      {{ Form::label('address[street1]', 'Address (Street 1)', array('class' => 'address')) }} 
      {{ Form::text('address[street1]') }} 

      {{ Form::label('address[street2]', 'Address (Street 2)', array('class' => 'address')) }} 
      {{ Form::text('address[street2]') }} 

      {{ Form::label('ddress[city]', 'City', array('class' => 'address')) }} 
      {{ Form::text('address[city]') }} 

      {{ Form::label('address[state]', 'State', array('class' => 'address')) }} 
      {{ Form::text('address[state]') }} 

      {{ Form::label('address[zip]', 'Zip Code', array('class' => 'address')) }} 
      {{ Form::text('address[zip]') }} 

      {{ Form::submit('Send this form!') }} 
     {{ Form::close() }} 
    </body> 
</html> 

Und wenn Sie dd(Input::all()) in Ihrem Controller tun, werden Sie so etwas wie dieses:

This is the Input::all() result Dieses Ergebnis wird durch Kint des dd vorgesehen ist(): https://github.com/raveren/kint. Wirklich hilfreich.

Wenn Ihr Formular nur Felder von einem einzigen Modell, können Sie Ihre Update-Methode sehr einfach sein und in etwa so aussehen:

public function update($id) 
{ 
    $user = User::find($id); 

    if (!$user->update(Input::all())) { 
     return Redirect::back() 
       ->with('message', 'Something wrong happened while saving your model') 
       ->withInput(); 
    } 

    return Redirect::route('user.saved') 
       ->with('message', 'User updated.'); 
} 

Auf Formen ein wenig komplexer, werden Programmierer müssen mehr Logik in den die Steuerungen, in denen Sie ein bisschen mehr Forschung Fall, dass ich denke, man kann damit dies geschieht:

public function update($id) 
{ 
    $user = User::find($id); 

    $inputs = Input::all(); 

    if (!$user->update($inputs)) { 
      $address = new UserAddress($inputs['address']); 

     $user->address()->save($address); 

     ... 
    } 

    ... 
} 
+0

Das ziemlich glatt ist. Wie formatiere ich die Eigenschaftsnamen in den Namensattributen der Felder? Wie 'user_address.street' oder vielleicht' users_address [street] 'oder anders? – eimajenthat

+0

Was auch, wenn ich den Benutzer mit Auth: user() abgerufen habe? Könnte ich Auth: user() -> leftJoin ('users_addresses', 'users.id', '=', 'users_addresses.user_id')? – eimajenthat

+0

Erzeugt dd() diese nette zusammenklappbare Array-Ansicht? Nie zuvor gesehen. Sieht aus wie [krumo] (http://krumo.sourceforge.net/), aber möglicherweise schöner. Auf jeden Fall dachte ich, dass die Bindung der Modellform etwas Magisches daran machte, die Felder im Modell zu speichern. Die Dokumentation sagt etwas darüber aus, dass Ihre Formular-Eingabenamen mit den Feldnamen des Modells übereinstimmen. Vielleicht nur um die Felder zu bevölkern? Aber wenn das der Fall ist, gibt es einen Standard, um die Adressfelder zu füllen? – eimajenthat

2

in Laravel 5.1 Beziehung Modell Bindung Sie müssen nur eifrig Last Beziehungstabelle (n):

$user = User::with(['address'])->find($id); 

Und angesichts Satzfelder Namen als Array:

{!! Form::model($user, ['route' => ['user.update', $user->id]) !!} 
    {!! Form::text('address[street]') !!} 
    {!! Form::text('address[number]') !!} 
{!! Form::close() !!}