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
我正在使用 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