编辑时唯一的密钥违规

时间:2014-09-17 20:10:19

标签: php mysql laravel laravel-4

我正在尝试更新博客帖子,但是我从数据库部分获得了唯一的密钥错误,然后我没有使用模型并直接访问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的新手并且是第一次尝试这个。

2 个答案:

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