在刀片视图中从第二个表关系中提取数据的正确方法是什么

时间:2015-08-26 02:22:00

标签: php eloquent blade laravel-5.1

在我的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字段。

1 个答案:

答案 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'));