Laravel形式模型绑定

时间:2013-06-01 14:18:02

标签: php forms laravel laravel-4 eloquent

我一直在阅读此功能:http://laravel.com/docs/html#form-model-binding

它看起来很整洁,但有几件我不确定的事情。

我是否需要在控制器操作中放置任何代码来处理此表单?那是什么样的?

我想在表单中绑定的模型(用户)有一个单独的地址表。所以我希望能够填写用户模型的字段,还能填写相关地址模型的字段。我可以使用表单模型绑定来执行此操作,还是必须手动处理表单?

或者,如果不这样做,我可以对用户字段使用表单模型绑定,但是手动处理地址字段吗?

2 个答案:

答案 0 :(得分:43)

您的控制器中不需要任何不同的代码来处理此表单。所有(命名)表单变量都将在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() ),您将获得以下内容:

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

        ...
    }

    ...
}

答案 1 :(得分:2)

在Laravel 5.1中,关系模型绑定只需要加载关系表:

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

在视图中将字段名称设置为数组:

    <script>
    $('#clientsearch').typeahead({
    source: function (query, process) {
        clients = [];
        map = {};
        var data = [{"clientID": "1", "clientName": "client 1"},
        {"clientID": "2", "clientName": "client 2"},
        {"clientID": "3", "clientName": "client 4"},
        {"clientID": "4", "clientName": "client 10"},
        {"clientID": "5", "clientName": "client 3"}
        ];
        $.each(data, function (i, client) {
            map[client.clientName] = client;
            clients.push(client.clientName);
        });
        process(clients);
    },
    matcher: function (item) {
        if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1) {
            return true;
        }
    },
    sorter: function (items) {
        return items.sort();
    },
    highlighter: function (item) {
        var regex = new RegExp('(' + this.query + ')', 'gi');
        return item.replace(regex, "<strong>$1</strong>");
    },
    updater: function (item) {
        $('#clientID').val(clients[item].clientID);
        return item;
    }
});
</script>