在我的应用程序中,我在用户和个人资料以及个人资料和用户之间建立了一对一关系。这样就可以从任何一种模型访问这种关系。
public function profile()
{
return $this->hasOne(Profile::class, 'user_username');
}
public function user()
{
return $this->belongsTo('App\User', 'user_username', 'username');
}
基本上,您可以通过引用定义关系的方法来访问关系。
所以我可以$user->profile
或$profile->user
来获取任何相关信息。
当用户访问特定页面时,他们应该能够查看和编辑他们的个人资料,因此我定义了GET和POST路由。
我有以下路线:
Route::get('/profile_edit/{user}','Editable\ProfileController@edit');
Route::post('/profile_edit/{user}','Editable\ProfileController@update');
显示表单
public function edit(User $user)
{
return view('editable.people.profile', compact('user'));
}
此方法通过按给定通配符搜索users表来获取配置文件信息,因此它基本上是SELECT * FROM {wildcard}
。
更新个人资料
在ProfileController
中,一个方法在作为资源控制器开始生效时自动生成。
public function update(Request $request, Profile $profile)
{
// ...
}
我之所以苦苦挣扎,是因为我看到的许多路线示例都是人类可读的,从简单的CRUD角度来看是有意义的,如下所示:
/posts -> show all posts
/posts{id} -> get a post by ID
/posts{id}/update -> get a post by ID and go to the update script
如果我不想在URL中使用很多slug,有没有办法从用户那里获取配置文件然后更新它?
在我给出的例子中
public function update(Request $request, Profile $profile)
该方法正在寻找个人资料的实例,但由于我的网址不是/edit/{profile}
,我甚至需要传递第二个参数吗?
我不能只做以下事情吗?
public function update(Request $request, Profile $profile)
{
$user = App\User::find($request->username);
$profile = Profile::where('user_username', $user->username);
$profile->background = $request->get('background');
$profile->skills = $request->get('skills');
$profile->user_username = $profile->user->username;
$profile->save();
}
答案 0 :(得分:2)
假设您已正确设置了Eloquent One-to-One
关系(通过迁移和模型);并且假设您在为经过身份验证的用户实现查看/编辑配置文件功能之后,您可以执行以下操作:
<强>路线强>
Route::get('profile_edit', 'ProfileController@view');
Route::post('profile_edit', 'ProfileController@update');
<强>控制器强>
public function view()
{
$profile = auth()->user()->profile;
return return view('editable.people.profile', compact('profile'));
}
public function update(Request $request)
{
// don't forget to do request validation here...
$user = auth()->user();
$profile = $user->profile;
if (!$profile) {
$profile = new Profile();
$profile->user_id = $user->id;
}
$profile->background = $request->get('background');
$profile->skills = $request->get('skills');
$profile->user_username = $user->username;
$profile->save();
// redirect or set success etc...
}
但是,如果您从管理员的角度来看,管理员想要查看或编辑已知用户的个人资料,您可以使用预先加载来执行此类操作:
<强>路线强>
Route::get('profile_edit/{user_id}', 'ProfileController@view');
Route::post('profile_edit/{user_id}', 'ProfileController@update');
<强>控制器强>
public function view($user_id)
{
$user = User::where('id', $user_id)->with('profile')->first();
if (!$user) {
throw new Exception('User with id '. $user_id .' does not exist.');
}
$profile = $user->profile;
return return view('editable.people.profile', compact('profile'));
}
public function update($user_id, Request $request)
{
// don't forget to do request validation here...
$user = User::where('id', $user_id)->with('profile')->first();
if (!$user) {
throw new Exception('User with id '. $user_id .' does not exist.');
}
$profile = $user->profile;
if (!$profile) {
$profile = new Profile();
$profile->user_id = $user->id;
}
$profile->background = $request->get('background');
$profile->skills = $request->get('skills');
$profile->user_username = $user->username;
$profile->save();
// redirect or set success etc...
}