2013-07-10 47 views
1

我有一个Laravel 4安装,我已经添加了ConfideEntrust包。委托更新不保存在Laravel 4

我想构建一个管理界面来管理用户,角色和权限。
我已经为权限创建了一个足智多谋的控制器,并且add和destroy函数都能正常工作,但编辑没有。该记录不更新数据库中的值。

这里是我的控制器代码:

<?php 

class PermissionController extends BaseController { 

    protected $permission; 

    public function __construct(Permission $permission) 
    { 
     $this->permission = $permission; 
    } 

    ... 

    /** 
    * Show the form for editing the specified resource. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function edit($id) 
    { 
     $permission = $this->permission->find($id); 

     if (is_null($permission)) 
     { 
      return Redirect::route('permissions.index'); 
     } 

     return View::make('permissions.edit', compact('permission')); 
    } 

    /** 
    * Update the specified resource in storage. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function update($id) 
    { 
     $input = array_except(Input::all(), '_method'); 
     $validation = Validator::make($input, Permission::$rules); 

     if ($validation->passes()) 
     { 
      $permission = $this->permission->find($id); 
      // create name from display_name 
      $input['name'] = $this->_machine_str($input['display_name']); 

      try { 
       $permission->update($input); 
       $queries = DB::getQueryLog(); 
       $last_query = end($queries); 
       print_r($queries); 
       die(); 
      } catch (Exception $e) { 
       var_dump($e->getTraceAsString()); 
       die(); 
      } 


      return Redirect::route('permissions.show', $id); 
     } 

     return Redirect::route('permissions.edit', $id) 
      ->withInput() 
      ->withErrors($validation) 
      ->with('message', 'There were validation errors.'); 
    } 

    ... 
} 

和模型:

<?php 

use Zizaco\Entrust\EntrustPermission; 

class Permission extends EntrustPermission 
{ 
    /** 
    *Soft delete enabled. 
    * 
    * @var boolean 
    */ 
    protected $softDelete = true; 

    protected $guarded = array('id'); 

    /** 
    * Ardent validation rules 
    * 
    * @var array 
    */ 
    public static $rules = array(
     'display_name' => 'required|between:4,32' 
    ); 
} 

的更新工作,如果我chnage模型扩展Eloquent,所以我可能是与EntrustPermission模型。

我也检查了数据库调用,它只显示选择没有任何种类的更新。

+0

你得到一个错误?尝试手动设置Permission中的变量,然后使用'save()',而不是使用'update($ input)'并传递参数数组。 – fideloper

+1

@fideloper你是对的。设置值的工作,仍然是过度的update()方法不能正常工作。 – Rooneyl

+1

正如标题下的[文档](http://laravel.com/docs/eloquent#insert-update-delete)中提到'update()'方法的部分**保存模型和关系** ,我假设它是为了保存关系模型,并且没有清楚记录。不是100%确定的。 – fideloper

回答

1

由于其中提到的update()方法是标题保存模型和关系section in the docs,我假设update()方法最适用于更新模型的关系,根本就没有明确记载。

如果改为采取更新Permission模型的属性和使用方法save()“更加手册”的方法,你可能会获得更大的成功:

/** 
* Update the specified resource in storage. 
* 
* @param int $id 
* @return Response 
*/ 
public function update($id) 
{ 
    $input = array_except(Input::all(), '_method'); 
    $validation = Validator::make($input, Permission::$rules); 

    if ($validation->passes()) 
    { 
     $permission = $this->permission->find($id); 
     // create name from display_name 
     $input['name'] = $this->_machine_str($input['display_name']); 

     try { 
      // Change to update attributes "manually" 
      $permission->name = $input['name']; 

      // Update any other attributes as necessary 
      $permission->any_other_attributes = $input['any_other_attributes']; // or Input::get('any_other_attributes') 

      // Finally, save (aka update) the Permission model's changes 
      $permission->save(); 

      $queries = DB::getQueryLog(); 
      $last_query = end($queries); 
      print_r($queries); 
      die(); 
     } catch (Exception $e) { 
      var_dump($e->getTraceAsString()); 
      die(); 
     } 


     return Redirect::route('permissions.show', $id); 
    } 

    return Redirect::route('permissions.edit', $id) 
     ->withInput() 
     ->withErrors($validation) 
     ->with('message', 'There were validation errors.'); 
}