Я читал об этой функции: http://laravel.com/docs/html#form-model-binding
И это выглядит очень аккуратно, но есть несколько вещей, о которых я не уверен.
Нужно ли мне вводить какой-либо код в действие контроллера для обработки этой формы? На что это похоже?
Модель (Пользователь), которую я хочу связать в моей форме, имеет отдельную таблицу для адресов. Поэтому я хочу иметь возможность заполнять поля модели пользователя, а также поля для соответствующей модели адресов. Могу ли я сделать это с помощью привязки формы-модели или мне нужно обрабатывать форму вручную?
Или, в противном случае, могу ли я использовать привязку модели модели для полей пользователя, но вручную обрабатывать поля адреса?
Для обработки этой формы вам не нужен какой-либо другой код в контроллере. Все ваши (названные) переменные формы будут в Input :: all ().
Модель ($ user), которую вы передаете
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() )
в своем контроллере, вы получите что-то вроде этого:
Этот результат предоставлен кином dd (): 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); ... } ... }
В Laravel 5.1 для привязки модели привязки вам просто нужно найти таблицы (-и) отношения нагрузки:
$user = User::with(['address'])->find($id);
И в виду, задайте имена полей как array:
{!! Form::model($user, ['route' => ['user.update', $user->id]) !!} {!! Form::text('address[street]') !!} {!! Form::text('address[number]') !!} {!! Form::close() !!}