Laravel 5.2 模型中的批量分配不适用于动态 table 名称

Laravel 5.2 mass assignment in model is not working with dynamic table name

我正在使用 Laravel 5.2

我有一个模型 User,我想在其中动态设置 table 名称并使用 mass assignment(即 create() 方法)将记录插入其中。我的代码是

用户:

class User extends Authenticatable
{
    use SoftDeletes;
    use Notifiable;

    protected $table = 'users';

    public function __construct() {
        parent::__construct();
        if(\Session::has("organization_id")){
            $org_id = \Session::get("organization_id");
            $t= $org_id.'_users';
            $this->setTable($t);
        }
    }

    protected $fillable = ['auth0_user_id','username', 'email', 'password',
                            'user_type','first_name','middle_name',
                            'last_name','gender','address',
                            'state','city','country',
                            'post_code','phone','photo',
                            'birth_date','status','doctor_title',
                            'created_by','updated_by','isGuest',
                            'email_varify','confirmation_code', 'membership_code'
                            ];

    protected $hidden = ['password', 'remember_token'];

    protected $appends = ['full_name','name_with_title'];

    protected $dates = ['deleted_at'];
}

用户控制器:

public function register(Request $request){
    $input = $request->all();
    $input['user_type']='patient';
    $input['password'] = \Hash::make($request->password);
    $input['isGuest']= '1';
    $input['status']= 'Incomplete';
    $input['username'] =  str_random(10);
    $input['confirmation_code']= str_random(30);
    $user = User::create($input);
}

问题是,它没有在我在 $input 变量中设置的各个列中插入任何值。

我已经使用

验证了 table 名称是否已更改
$user->getTable();

看起来还可以。我得到了准确的 table 名称。

如果我使用

dd ($user);

则结果如下:

App\Models\User Object
(
    [table:protected] => 1_users
    [fillable:protected] => Array
        (
            [0] => auth0_user_id
            [1] => username
            [2] => email
            [3] => password
            [4] => user_type
            [5] => first_name
            [6] => middle_name
            [7] => last_name
            [8] => gender
            [9] => address
            [10] => state
            [11] => city
            [12] => country
            [13] => post_code
            [14] => phone
            [15] => photo
            [16] => birth_date
            [17] => status
            [18] => doctor_title
            [19] => created_by
            [20] => updated_by
            [21] => isGuest
            [22] => email_varify
            [23] => confirmation_code
            [24] => membership_code
        )

    [hidden:protected] => Array
        (
            [0] => password
            [1] => remember_token
        )

    [appends:protected] => Array
        (
            [0] => full_name
            [1] => name_with_title
        )

    [dates:protected] => Array
        (
            [0] => deleted_at
        )

    [connection:protected] => 
    [primaryKey:protected] => id
    [keyType:protected] => int
    [perPage:protected] => 15
    [incrementing] => 1
    [timestamps] => 1
    [attributes:protected] => Array
        (
            [updated_at] => 2016-10-27 05:53:17
            [created_at] => 2016-10-27 05:53:17
            [id] => 20
        )

    [original:protected] => Array
        (
            [updated_at] => 2016-10-27 05:53:17
            [created_at] => 2016-10-27 05:53:17
            [id] => 20
        )

    [relations:protected] => Array
        (
        )

    [visible:protected] => Array
        (
        )

    [guarded:protected] => Array
        (
            [0] => *
        )

    [dateFormat:protected] => 
    [casts:protected] => Array
        (
        )

    [touches:protected] => Array
        (
        )

    [observables:protected] => Array
        (
        )

    [with:protected] => Array
        (
        )

    [exists] => 1
    [wasRecentlyCreated] => 1
    [forceDeleting:protected] => 
)

在这里,您可能会发现 table 名称已成功更改,但我在 [attributes:protected][original:protected].

中找不到任何列

我也试过:

$user = new User(); 
$user->create($input); 

但似乎没有任何效果。

如果我使用,

$user = new User(); 
$user->email = $input['email']; 
$user->save()

然后它似乎工作正常但为此我必须在许多地方更新我的代码。

有批量分配的解决方案吗?

关键在于,只有非静态调用才会有正确的 table 名称,因为此 setTable 方法仅在调用构造函数时调用。因此,这将起作用:

$user = new User; // constructor is called
$user->someinfo = 'foo';
$user->save();

这不会:

User::create(['someinfo' => 'foo']); 
// constructor is not called here

那么问题就变成了:在哪里定义这个有条件的 table 名称?您可以在创建对象时使用事件绑定之类的东西,或者您可以使用构造函数中提供的函数覆盖 getTable() 函数:

// in your model
public function getTable() {
  if(\Session::has("organization_id")){
    $org_id = \Session::get("organization_id");
    return $orig_id . '_users';
  }
  return 'users';
}

一个很好的解决方案也可以是使用特征,它在启动时执行此操作。

祝你好运!让我知道这是否有效。

更新

对不起,我错了。静态 create() 方法实际上构建了模型:

public static function create(array $attributes = [])
{
    $model = new static($attributes);
    $model->save();
    return $model;
}

我认为您最初的修复点没有奏效,这些行是:

public function __construct() {
  parent::__construct();

根据create()的代码,你也应该传递$attributes变量:

public function __construct(array $attributes = []) {
  parent::__construct($attributes);
  // here your original setTable() code