【问题标题】:Laravel 5.2 $fillableLaravel 5.2 $可填充
【发布时间】:2016-04-24 05:03:24
【问题描述】:

假设我的模型具有以下数据库结构:

name:string
last_name:string

我希望更新模型,给定这个 $request->input() 数组:

name => 'Quinn',
last_name => 'Daley',
middle_name => 'Phill'

我会收到一条错误消息,因为它会尝试更新数据库中不存在的 middle_name 字段。

所以这是我的问题: 我怎样才能让它只更新现有字段?不使用protected $fillable 属性。

编辑:我不想使用 $fillable 的原因是我不想列出数据库中的所有现有字段。如果我有一个包含 50 个字段的大型模型怎么办?是否有可能只接受来自$request->input()的模型数据库中存在的参数?

更新

使用$model->getAttributes() 有一个更清洁的解决方案:

$user->update($request->only(array_keys($user->getAttributes()))

如果您为模型使用不同的$connection,此解决方案也会更好,我就是这种情况。

【问题讨论】:

    标签: php laravel laravel-5 eloquent laravel-5.2


    【解决方案1】:

    如果您使用创建或更新功能,将需要受保护的 $fillable。但是,我认为您可以在不使用受保护的 $fillable 属性的情况下以这种方式解决它。

    $yourmodel = YourModel::find($id);
    $yourmodel->name = $request->input("name");
    $yourmodel->last_name = $request->input("last_name");
    $yourmodel->save();
    

    【讨论】:

      【解决方案2】:

      你可以这样使用可填充数组:

      // in your model
      
      /**
       * Get only available fields
       *
       * @param  array  $input
       * @return array
       */
      public function filterFields(array $input)
      {
          $fields = $this->fillable;
      
          return array_filter($input, function ($v, $k) use ($fields) {
              return in_array($k, $fields);
          }, ARRAY_FILTER_USE_BOTH);
      }
      

      并过滤来自$request->input()的数据; 您也可以为此目的制作中间件。

      【讨论】:

        【解决方案3】:

        您可以在请求上使用only()except() 方法来限制字段,而不是使用input()all()。例如:

        $user = User::find(1);
        
        $user->update($request->only(['name', 'last_name']));
        // or
        $user->update($request->except(['middle_name']));
        

        编辑

        如果要获取表的列名,可以使用Schema::getColumnListing($tableName); 来完成。因此,在这种情况下,您的代码将类似于:

        $user = User::find(1);
        
        $user->update($request->only(Schema::getColumnListing($user->getTable())));
        

        【讨论】:

        • 我不想使用 $fillable 的原因是列出所有字段需要太多时间。如果模型中有 50 个字段怎么办。会是$request->only(['field1', 'field2', ... 'field50']吗?
        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        相关资源
        最近更新 更多