2016-10-28 1 views
0

Я использую Laravel 5.2.Массовое назначение 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']; 
} 

UserController:

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 переменная.

Я проверил, если имя таблицы изменилось или не используя

$user->getTable(); 

и, кажется, в порядке. Я получаю точное имя таблицы.

Если я использую

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] => 
) 

Здесь вы можете найти имя таблицы успешно изменилось, но я не найти каких-либо столбцов в [attributes:protected] или в [original:protected] ,

Кроме того, я попытался как:

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

Но ничто не кажется, работает.

Если я использую,

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

Тогда, кажется, работает нормально, но для этого я должен обновить свои коды во многих местах.

Любое решение для массового назначения?

ответ

1

Дело в том, что только нестатические вызовы будут иметь правильное имя таблицы, потому что этот метод setTable вызывается только при вызове конструктора. Таким образом, это будет работать:

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

И это не будет:

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

Таким образом, вопрос становится тогда: где определить это условное название таблицы? Вы можете использовать что-то вроде события связывания, при создании объектов, или вы могли бы просто переопределить функцию GetTable() с помощью функции, представленной в конструкторе:

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

хорошее решение для этого также можно использовать черту, который выполняет это действие при его загрузке.

Удачи вам! Дайте мне знать, если это сработает.

Update

Мне очень жаль, что я был неправ. Статический метод создания() не на самом деле построить модель:

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

Я думаю, точка исходного исправления не работает, эти линии:

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

По коду создания (), вы также должны пройти через переменную $ attributes:

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

Спасибо за ответ. Позвольте мне проверить и сообщить вам. – Dev

+0

Это сработало. Большое спасибо. – Dev

+0

Рад, что я мог помочь, но я не очень хорошо объяснил это. См. Мой обновленный ответ. –

Смежные вопросы