Laravel形式模型绑定
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel形式模型绑定相关的知识,希望对你有一定的参考价值。
我一直在读这个功能: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() )
,你会得到这样的东西:
这个结果由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() !!}
以上是关于Laravel形式模型绑定的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eager Loading 和动态绑定模型关系