我正在尝试更新博客帖子,但是我从数据库部分获得了唯一的密钥错误,然后我没有使用模型并直接访问ORM但是再次没有成功。
这是我编辑的路线
Route::get('/getedit/{slug}', array('as' => 'getedit', 'uses' => 'AdminController@getEdit'))->before('auth');
Route::post('/postedit', array('as' => 'postedit', 'uses' => 'AdminController@postEdit'))->before('auth');
控制器
public function getEdit($slug)
{
$article = Post::where('slug', '=' , $slug)
->firstOrFail();
return View::make('admin.edit', array(
'title' => $article->title,
'mainarticle' => $article->article,
'slug' => $article->slug,
'category' => $article->category
));
}
// Updates articles to database
public function postEdit()
{
$rules = [
'title' => 'required',
'article' => 'required',
'slug' => 'required|unique:posts,slug,9',
'category' => 'required'
];
$input = Input::all();
$validator = Validator::make($input, $rules);
if ($validator->fails()) {
return Redirect::route('getedit')
->withErrors($validator);
// withInput not defined
}
else
{
$slug = $input['slug'];
/*$affectedRows = Post::where('slug', '=', $slug)->update([
'title' => $input['title'],
'article' => $input['article'],
'slug' => $input['slug'],
'category' => $input['category']
]);*/
/*$affectedRows = Post::where('slug', '=', $slug)->firstOrFail();
$affectedRows->title = $input['title'];
$affectedRows->article = $input['article'];
$affectedRows->slug = $input['slug'];
$affectedRows->category = $input['category'];
$affectedRows->save();*/
$post = DB::table('posts')->where('slug', '=', $slug)->update([
'title' => $input['title'],
'article' => $input['article'],
'slug' => $input['slug'],
'category' => $input['category']
]);
if ($post) {
return Redirect::route('dashboard')
->with('flash_message','Article Successfully Inserted');
}
else
{
return Redirect::route('dashboard')
->with('flash_message','Error updating data');
}
}
}
我的模型只是创建数据库的对象(我不小心遵循胖控制器和瘦模型方法,因为我只是尝试框架)。
我尝试使用Post::find(1)->update($data);
方法但是返回了唯一的违规行为,而我当前的方法只是执行在更新失败时触发的else语句。
注意:我是Laravel的新手并且是第一次尝试这个。
答案 0 :(得分:0)
您应该检查数据库表索引。您应该确保只有slug
具有唯一索引。
我看到你正在检查slug的唯一性,但你在规则中硬编码了9:
'slug' => 'required|unique:posts,slug,9',
应该是:
'slug' => 'required|unique:posts,slug,'.$id,
您尝试编辑的帖子的$id
ID。
你应该在你的表单中包含这样的id
作为隐藏元素而不是搜索带有slug的记录,因为你似乎可以编辑你的slug,你可能编辑错误的记录或者什么都不编辑。
答案 1 :(得分:0)
更新帖子时,您宁愿向指定资源发送POST
(或更好的PATCH
/ PUT
- http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)请求。
也就是说,您将在网址中包含已修改的行键,并将您的方法更改为以下内容:
// route
Route::post('/postedit/{id}', array('as' => 'postedit', 'uses' => 'AdminController@postEdit'))
->before('auth');
// controller
public function postEdit($id)
{
// if no posts with $id found, throws exception - catch it and eg. show 404
$post = Post::findOrFail($id);
$rules = [
'title' => 'required',
'article' => 'required',
'slug' => 'required|unique:posts,slug,'.$id, // to ignore this row in unique check
'category' => 'required'
];
// validate
$post->fill($input)->save(); // fill() in order to use mass-assignement check
// alternatively you can just update:
// $post->update($input);
// but then make sure $input has only elements corresponding to the table columns
此外,请阅读route grouping,因此您无需单独向这些路线添加before('auth')
。