簡體   English   中英

Laravel形式模型綁定

[英]Laravel form model binding

我一直在閱讀這個功能: 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();

並將此組合模型傳遞給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() ) ,你會得到這樣的東西:

這是Input :: all()結果 這個結果由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);

        ...
    }

    ...
}

在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() !!}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM