2013-06-01 64 views
23

我一直在閱讀有關此功能:http://laravel.com/docs/html#form-model-bindingLaravel表單模型結合

它看起來很整潔,但也有幾件事情是我不能肯定的。

我是否需要在控制器操作中放置任何代碼來處理此表單?這是什麼樣子?

我想在我的形式結合的模式(用戶)有地址的單獨的表。所以我希望能夠填寫User模型的字段,但也要填寫相關Address模型的字段。我可以使用表單模型綁定來做到這一點,還是我必須手動處理表單?

或者,做不到這一點,我可以使用表單模型爲用戶領域的結合,但手工處理地址字段?

回答

41

您的控制器中不需要任何不同的代碼來處理此表單。所有(命名的)表單變量都將在Input :: all()中。

模型($用戶),您在

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

傳遞正是你需要,如果你有一個以上的表參與,你必須做一些像

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

並將此組合模型傳遞給Form :: model()。

你如何命名你的投入是完全取決於你,因爲你必須寫處理您的表單的邏輯。但是,在我看來,地址輸入的users_address[street]是好的,因爲您最終會得到一組地址列,您可以立即將其傳遞到您的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> 

如果你在你的控制器做dd(Input::all()),你會得到這樣的:https://github.com/raveren/kint

This is the Input::all() result 這個結果是通過編制品的DD()提供。真的很有幫助。

如果你的形式只是從一個單一的示範田,你的更新方法可以很簡單,看起來像:

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

上形成更復雜一點,編碼器將有更多的邏輯添加到它們的控制器,在你有更多的一點點研究情況下,我認爲你可以做到這一點:

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

這是非常漂亮的。那麼如何格式化字段名稱屬性中的屬性名稱呢?像'users_address.street'或者'users_address [street]'或者其他方式? – eimajenthat

+0

另外,如果我通過Auth:user()檢索用戶,該怎麼辦?我可以做auth:user() - > leftJoin('users_addresses','users.id','=','users_addresses.user_id')? – eimajenthat

+0

dd()生成那個漂亮的可摺疊數組視圖嗎?以前從未見過。看起來像[krumo](http://krumo.sourceforge.net/),但可能更好。無論如何,我認爲模型表單綁定在將字段保存到模型方面做了一些神奇的事情。文檔中提到了使表單輸入名稱與模型字段名稱相匹配的內容。也許這只是填充字段?但是,如果是這樣的話,是否有一個標準可以使地址字段填充? – eimajenthat

2

在Laravel 5.1關係模型的結合,你只需要急於負載關係表(S):

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

,並考慮設置的字段名作爲數組:

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