在我的route.php中,我定义了组路由资源:
Route::group(['middleware' => 'role:admin|staff|retailer|customer|spy'],
function()
{
Route::resource('profiles', 'ProfileController');
});
我的User.php模型包含此关系
public function address ()
{
return $this->hasOne('App\Address', 'user_id');
}
我的Address.php模型包含这种关系
public function user ()
{
return $this->belongsTo('App\User');
}
在我的ProfileController.php中,我有一个名为edit()的REST方法,它将$ user变量发送到视图刀片
public function edit($id)
{
$user = Auth::user();
return view('profiles.edit')->with('user',$user);
}
现在就是这件事:这是我的/view/profiles/edit.blade.php。只需编辑2个编辑字段:
{!! Form::model($user, [
'method' => 'PATCH',
'route' => ['profiles.update', $user->id]
]) !!}
<div class="form-group">
{!! Form::label('lblfirst_name', 'First Name:', ['class' => 'control-label']) !!}
{!! Form::text('first_name', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('lbladdress_line1', 'Address line 1:', ['class' => 'control-label']) !!}
{!! Form::text('address_line1', $user->address->address_line1, ['class' => 'form-control']) !!}
</div>
{!! Form::close() !!}
注意
$user->address->address_line1
目前这就是我如何从地址表中提取数据并使用这种方式,我发现这个表单有1个额外的SQL查询:
select * from addresses where addresses.user_id = '1' and addresses.user_id is not null limit 1
我的问题是,有更好的方法吗?我的意思是不进行额外的查询,比如我如何提取上面的First Name字段。
答案 0 :(得分:1)
当您致电 Auth :: user()时,它会:
供应商/ laravel / SRC /照亮/认证/ EloquentUserProvider.php:
/**
* Retrieve a user by their unique identifier.
*
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier)
{
return $this->createModel()->newQuery()->find($identifier);
}
它获取用户模型并执行 - &gt; find($ id),因此即使您更改find()函数的行为您也必须发送第二个请求以检索相关数据。这就是Eloquent的做法。
您唯一能做的就是缓存第二个查询:
$user = Auth::user();
$address = Cache::remember('users::'.$user->id.'::address', 10, function() use ($user) {
return Address::where('user_id', $user->id)->first();
});
return view('profiles.edit', compact('user', 'address'));