Подтвердить что ты не робот

Привязка модели формы Laravel

Я читал об этой функции: http://laravel.com/docs/html#form-model-binding

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

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

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

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

4b9b3361

Ответ 1

Для обработки этой формы вам не нужен какой-либо другой код в контроллере. Все ваши (названные) переменные формы будут в 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() ) в своем контроллере, вы получите что-то вроде этого:

This is the Input::all() result Этот результат предоставляется Kint 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);

        ...
    }

    ...
}

Ответ 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() !!}