Laravel Dynamic Fillable in Models

Deadly 提交于 2020-04-05 15:25:09

问题


Got stuck in a issue with laravel 5.2.

Following is the error during eloquent create operation(post call),

Mass Assignment Exception in Model.php 453: column_name

Following are the prerequisites, which are to be taken into consideration:

  1. Fillables in model are filled in a dynamic manner by the following code:
    public function __construct() {
         $this->fillable(\Schema::getColumnListing($this->getTable()))
    }
    

Following are the methods which are debugged till now:

  1. Before insertion, in controller, $model::getillableField(), gives proper fillable array.

  2. In model.php line(450),

    if ($this->isFillable($key)) {
          $this->setAttribute($key, $value);
    }
    

    the above code returns the value as "false" and $model::getFillableField() has the column_name in the array list.

  3. Hardcoding $fillable variable with columns of table removes the error. Please Help, where i am going wrong and what is the solution for it?

Thanks in advance.


回答1:


What you are really trying to do is make ALL fields fillable.

The correct way to do this in Laravel is this:

protected $guarded = [];

This works in 5.2, even though the documentation for it is found in 5.3.

(relevant source code for 5.2)

(Documentation from 5.3):

If you would like to make all attributes mass assignable, you may define the $guarded property as an empty array:

By setting $guarded to an empty array, you are creating an empty black list, allowing all fields to be mass assignable.

Also, if this model is ever going to be constructed directly from user input, please do not do this. Laravel requires either $fillable or $guarded to be defined for a reason. Unless your model has fields that are literally 1:1 with a public form, then allowing all fields to be writable on mass assignment is a security vulnerability.




回答2:


Try this. Put the below code in your model,

public function __construct()
{
    $this->setFillable();
}
public function setFillable()
{
    $fields = \Schema::getColumnListing('table_name_here');

    $this->fillable[] = $fields;
}

This makes each and every column is fillable from that table.




回答3:


Create a trait that uses the database columns.

<?php

namespace App\Traits;

use Illuminate\Support\Facades\Schema;

trait ColumnFillable
{
    public function getFillable()
    {
        return Schema::getColumnListing($this->getTable());
    }
}

Now use this trait in your models.

<?php

namespace App;

use App\Traits\ColumnFillable;

class MyModel extends Model
{
    use ColumnFillable;

    ...

Now you'll never have to manually specify $fillable.



来源:https://stackoverflow.com/questions/40100709/laravel-dynamic-fillable-in-models

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!