2013-06-01 13 views
23

Czytałem o tej funkcji: http://laravel.com/docs/html#form-model-bindinglaravel wzór formularza wiązania

I wygląda naprawdę fajnie, ale istnieje kilka rzeczy, że nie jestem pewien temat.

Czy muszę wstawić dowolny kod do akcji kontrolera, aby przetworzyć ten formularz? Jak to wygląda?

Model (użytkownik) Chcę powiązać w mojej formie ma osobną tabelę dla adresów. Dlatego chcę mieć możliwość wypełnienia pól modelu użytkownika, ale także pól powiązanych z modelem adresu. Czy mogę to zrobić przy użyciu wiązania do modelu formularza, czy też muszę obsługiwać formularz ręcznie?

Czy, w przypadku niepowodzenia, można użyć wiązania modelu formularza dla pól użytkownika, ale ręcznie obsłużyć pola adresu?

Odpowiedz

41

Nie potrzebujesz żadnego innego kodu w swoim kontrolerze, aby przetworzyć ten formularz. Wszystkie zmienne formularza (nazwane) będą w Input :: all().

Model ($ user) przechodzą w

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

Czy byle rekord trzeba, jeśli masz więcej niż jeden stół zaangażowany, musisz zrobić coś takiego

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

I przekazać ten złożony model do formularza Form :: model().

To, jak określasz swoje dane wejściowe, należy wyłącznie do Ciebie, ponieważ musisz napisać logikę, aby przetworzyć formularz. Ale, moim zdaniem, users_address[street] dla wejść adresów jest dobre, ponieważ otrzymasz tablicę adresów kolumn, które możesz od razu przekazać do swojego modelu UserAddress.

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

A jeśli nie dd(Input::all()) w kontrolerze, dostaniesz coś takiego:

This is the Input::all() result Wynik ten jest dostarczany przez kint za dd(): https://github.com/raveren/kint. Naprawdę pomocny.

Jeśli formularz po prostu pola z jednego modelu, metoda aktualizacji może być bardzo prosty i wyglądać mniej więcej tak:

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.'); 
} 

Na form trochę bardziej skomplikowane, programiści będą musieli dodać więcej logiki ich kontrolerów, w ty etui z trochę więcej badań Myślę, że można tego dokonać:

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

to dość śliski. Jak sformatować nazwy właściwości w atrybutach nazw pól? Jak 'users_address.street' lub może' users_address [street] 'lub w inny sposób? – eimajenthat

+0

Co się stanie, jeśli pobiorę użytkownika przez Auth: user()? Czy mogę wykonać polecenie Auth: user() -> leftJoin ("users_addresses", "users.id", "=", "users_addresses.user_id")? – eimajenthat

+0

Czy dd() generuje ten ładny, zwijany widok tablicy? Nigdy wcześniej tego nie widziałem. Wygląda jak [krumo] (http://krumo.sourceforge.net/), ale może ładniej. W każdym razie, myślałem, że powiązanie formularza modelu zrobiło coś magicznego wokół zapisywania pól w modelu. Dokumenty mówią coś o nadawaniu nazwom wejściowym formularzy pasujących do nazw pól modelu. Może to tylko do zaludnienia pól? Ale jeśli tak, czy istnieje standard, który należy wykonać, aby wypełnić pola adresu? – eimajenthat

2

w laravel 5.1 dla modelu relacji wiążących wystarczy tabeli chętny obciążenia relacji (ów):

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

iw świetle ustaw pól nazw jako tablicy:

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