Laravel CRUD解释

时间:2018-04-24 22:35:41

标签: php laravel

在我的应用程序中,我在用户和个人资料以及个人资料和用户之间建立了一对一关系。这样就可以从任何一种模型访问这种关系。

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

1 个答案:

答案 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...
}