Наследование пользовательской таблицы в OctoberCMS

У меня два пользователя: учителя и ученики, у каждого из них разные атрибуты. Например: у ученика один класс, у учителя много классов и т. Д.
Я хотел бы унаследовать плагин OctoberCMS Users и добавить два контроллера с этими дополнительными атрибутами (один для учеников, а другой для учителей). Итак, я создал две модели, расширяющие модель пользователя. эти две модели используют одну и ту же таблицу пользователей, и я добавил две таблицы для учителей и учеников, но я не могу связать их с таблицей пользователей.
Вот что я сделал:

class Teacher extends User 
{
  public $hasOne=[
    'mobile'=>'??',
  ]
}

Итак, я хочу добавить мобильное поле и другие поля для каждого учителя в таблице учителей, как я могу это сделать?
Обратите внимание, что я не хочу добавлять поля в таблицу пользователей. Мне нужны общие столбцы в таблице пользователей, дополнительные поля учитель в таблице учителя и дополнительные поля ученика в таблице учеников.


person Behiry    schedule 15.03.2018    source источник


Ответы (3)


Что ж, вот решение, которое я получаю:
1- Добавьте дополнительные поля учителей и учеников в таблицу пользователей.
2- Позвольте моделям учителя и ученика расширить модель пользователя
3- Добавьте функцию к каждой модели, чтобы добавить группу пользователей (учитель или ученик) перед сохранением.
4- Примените фильтр к контроллерам учителей и учеников, чтобы перечислить только их группы.

Это полный код:

class UserAddFields extends Migration
{
public function up()
{
    if (Schema::hasColumn('users', 'mobile')) {
        return;
    }

    Schema::table('users', function($table)
    {
        $table->string('mobile', 100)->nullable();
        $table->integer('class_id', 100);
    });
}

}


class Teacher extends User
{
public $belongsToMany = [
    'groups' => [UserGroup::class, 'table' => 'users_groups', 'key' => 'user_id', 'otherKey' => 'user_group_id']
];

public function beforeCreate()
    {
            $this->groups=UserGroup::where('code','teachers')->first();
    }           
}

class Teachers extends Controller
{
public function listExtendQuery($query)
    {
            $query->whereHas('groups', function ($q){
                $q->where('code', '=', "teachers");
            });
    }
}

и то же самое для студентов.

person Behiry    schedule 16.03.2018

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

После этого вам нужно назначить отношения между Учителем, Студентом и Пользователем. Чтобы понять отношения, вы можете обратиться к Octobercms Relations.

На мой взгляд, отношения должны быть такими, как показано ниже:

В модели "Учитель и ученик"

public $belongsTo = [
    'user'             => [ 'RainLab\User\Models\User' ],
];

И плагин Rainlab User имеет модель группы, поэтому вы можете назначать пользователей в разные группы, такие как «учитель» и «ученик».

И, кроме того, если вы хотите добавить дополнительное поле, например модель, вы можете использовать плагин User Plus, а также плагин User Plus.

person Chirag Patel    schedule 16.03.2018
comment
Спасибо Chiraq, я добавил все поля в таблицу пользователей и добавил две модели, которые используют одну и ту же таблицу (пользователей) с разными функциями для каждой. Но как я могу получить учителей только по модели учителя? потому что каждая модель теперь по умолчанию перечисляет все записи. - person Behiry; 16.03.2018

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

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

«Метод :: __ toString () не должен вызывать исключение, обнаруженное Illuminate \ Database \ Eloquent \ JsonEncodingException: модель кодирования ошибок ...»

person Deveoo    schedule 09.08.2018