我正在玩Laravel 5.我正在尝试构建一个网站,用户可以在其中添加一些关于他自己的信息,它会显示在前端。
我很难理解如何只保存配置文件信息一次。 每次用户调用/ profile / create都会创建一个新的DB条目。但我每个用户只需要一个配置文件条目! 如果我没有提供/ profile / create路由,用户如何将他的个人资料信息保存到数据库?因为用户无法调用配置文件/编辑,因为不存在任何条目。
这是我的控制器:
namespace App\Http\Controllers;
use App\User;
use App\Profile;
use App\Http\Requests\ProfileRequest;
use App\Http\Requests;
use Illuminate\Http\Request;
use Auth;
class ProfilesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('backend.profile.index');
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('backend.profile.create');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(ProfileRequest $request)
{
$profile = new Profile($request->all());
Auth::user()->profiles()->save($profile);
return 'saved';
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
我的个人资料模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
protected $fillable = [
'name',
];
public function user() {
$this->belongsTo('App\User');
}
}
我的用户模型:
/**
* A User can have one Preference
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function profiles() {
return $this->hasOne('App\Profile');
}
答案 0 :(得分:0)
有很多种方法,如果用户已有个人资料,就会抛出异常:
public function store(ProfileRequest $request)
{
$user = Auth::user();
if($user->profiles){
abort(500);
}
$profile = new Profile($request->all());
$user()->profiles()->save($profile);
return 'saved';
}
在您的模板中,您可以显示创建个人资料或编辑个人资料的链接,具体取决于用户是否还有。
如果您愿意,可以在中间件中进行检查,或者做一名警卫。
@Maraboc在评论中提到的另一个不错的方法是在注册时创建一个空白的配置文件,因此您只需要一个编辑路径。
值得一提的是,如果用户只有一个个人资料,则应将该资产命名为“个人资料”而不是“个人资料”
答案 1 :(得分:0)
您可以在创建新用户时创建空配置文件。另一种方法是在编辑/更新操作中存在配置文件时结帐,如下所示:
public function edit()
{
//if profile will be edited at first time, then dummy profile will be used
$profile = Auth::user()->profile ?: new Profile();
return view('backend.profile.edit', compact('profile'));
}
public function update(Request $request)
{
//validate your data
//use $fillable in Profile model to whitelist acceptable attributes
if(Auth::user()->profile) {
Auth::user()->profile->update($request->all());
} else {
$profile = new Profile($request->all());
Auth::user()->profile()->save($profile);
}
//redirect to another page
}