2013-06-01 2 views
23

Я читал об этой функции: http://laravel.com/docs/html#form-model-bindingLaravel модели форма связывание

И это выглядит очень аккуратным, но есть несколько вещей, которые я не уверен.

Нужно ли мне вводить какой-либо код в действие контроллера для обработки этой формы? На что это похоже?

Модель (Пользователь) Я хочу связать в своей форме, имеет отдельную таблицу для адресов. Поэтому я хочу иметь возможность заполнять поля модели пользователя, а также поля для соответствующей модели адресов. Могу ли я сделать это с помощью привязки формы-модели или мне нужно обрабатывать форму вручную?

Или, в противном случае, могу ли я использовать привязку модели модели для полей пользователя, но вручную обрабатывать поля адреса?

ответ

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(); 

И передать эту скомпонованную модель в форму :: 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()) в контроллере, вы получите что-то вроде этого:

This is the Input::all() result Этот результат предоставляется Д.Д. Kint (в): https://github.com/raveren/kint. Действительно полезно.

Если ваша форма просто поля из одной модели, ваш метод обновления может быть очень простой и выглядеть примерно так:

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 для реляционной модели связывание вам просто нужно нетерпеливые нагрузки соотношения стола (ы):

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

И просмотреть набор полей имена, как массив:

{!! Form::model($user, ['route' => ['user.update', $user->id]) !!} 
    {!! Form::text('address[street]') !!} 
    {!! Form::text('address[number]') !!} 
{!! Form::close() !!} 
Смежные вопросы