WedX - журнал о программировании и компьютерных науках

Laravel 5 совет по структуре/архитектуре ООП

У меня есть общий вопрос о том, как реализовать наилучшую практику структуры модели для приложения, которое я создаю в Laravel 5.

Итак, на данный момент у меня настроено так:

Модель и таблица «user»: идентификатор, электронная почта, пароль, уровень администратора — на самом деле это просто информация для аутентификации входа.

Модель и таблица 'user-details': идентификатор, идентификатор пользователя (внешний ключ для поля идентификатора пользовательской таблицы), имя, адрес и т. д. — все остальные сведения.

Модель и таблица «тип урока»: идентификатор, идентификатор учителя (внешний ключ для поля идентификатора таблицы сведений о пользователе), ярлык урока и т. д. — информация о различных типах уроков.

На данный момент у меня есть Контроллер учителя, в котором я перехожу к представлению: - Информация из таблицы User - Информация из таблицы User-details - Список различных типов уроков для учителя из таблицы типов уроков.

Но мне кажется, что все это должно быть связано с одной отдельной моделью учителя, которая расширила бы модель детали пользователя (и, возможно, которая, в свою очередь, должна расширить модель >Пользовательская модель), но не будет иметь собственной таблицы, связанной с ней, но вся информация, относящаяся либо к обновлениям сведений о пользователе, либо к таблице типов уроков, будет храниться в этих соответствующих таблицах. Было бы это правильно?

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

Затем я передал бы в представление только объект модели «Учитель» и, таким образом, получил бы доступ ко всей информации об учителе, такой как личные данные и массив типов уроков.

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

1 - техническая реализация: я думаю, в модели учителя я бы заполнил всех соответствующих учителей переменными класса (имя, массив уроков и т. д.) в конструкторе?

2 - не усложняю ли я эту структуру, имея таблицы сведений о пользователях и пользователях?

3. Имеет ли то, что я предлагаю, наиболее структурный смысл в Laravel?

4 - просто еще одна мысль, которая у меня только что возникла, должен ли идентификатор учителя в таблице типов уроков на самом деле ссылаться на таблицу пользователей, а не на таблицу сведений о пользователе... так что данные о пользователе и тип урока были бы прямыми дочерними элементами пользовательская таблица??

Очень очень признательна за любую помощь :)

12.08.2015

Ответы:


1

Вы не должны расширять такие модели, если нет явного наследования. С логической точки зрения это просто не имеет никакого смысла, поскольку вам все равно придется перезаписывать большую часть того, что есть в модели User. И то, что вы не перезапишете, будет неправильно сопоставлено с базой данных, потому что это 2 совершенно разные таблицы. Что вы на самом деле хотите сделать, так это использовать отношения Eloquent.

Для ясности я предполагаю эту базовую структуру:

users - id
teachers - id, user_id
user_details - id, user_id
lesson_types - id, teacher_id

Это должны быть 4 совершенно разные модели, связанные между собой методом Model::belongsTo(). Таким образом, модель Teacher будет

class Teacher extends Model {
    public $table = 'teachers';

    public function user() {
        return $this->belongsTo('App\User');
    }
}

Когда вы запрашиваете учителя, вы можете сделать Teacher::with('user')->get(). Это вернет все записи из таблицы учителей, и в каждом экземпляре модели Teacher вы сможете вызвать $teacher->user и получить экземпляр User, связанный с этим учителем. Это полная модель, а не просто дополнительные данные, поэтому у вас есть доступ ко всему в модели User, что обычно является основной причиной расширения.

Для вашего списка вопросов:

  1. Я могу вас неправильно понять, но ORM работает не так. Я бы посоветовал вернуться и прочитать документы Eloquent (если вы используете 5.0, я предлагаю прочитать документы 5.1, поскольку они намного, намного лучше)
  2. Это будет зависеть от того, кого вы спросите, но я склонен так думать. Если данные явно связаны и нет причин для их совместного использования между типами записей (например, у меня обычно есть таблица addresses, на которую ссылаются все записи, а не 5 полей адресов, повторяющихся в нескольких таблицах), я считаю, что все должно быть на одном столе. Это просто усложняет управление позже, если у вас есть это в отдельных таблицах.

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

  3. Нет, как я объяснил выше
  4. Столбец teacher_id должен ссылаться на таблицу teachers, предполагая, что уроки принадлежат учителям, а не любому пользователю в системе. Используя ORM, вы сможете сделать $lesson->teacher->user->userDetails, чтобы получить эти данные.

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

12.08.2015
  • Большое спасибо за подробный ответ, очень признателен. Я не очень хорошо объяснил сам, но вы подтвердили то, что я подозревал, что эти модели должны быть расширены из таблицы сведений о пользователе/пользователе (и свойства, полученные через модель учителя как полный объект - просто не было не уверен в синтаксисе для этого, спасибо 4!). С тех пор я объединил таблицы user и userdetails. То, что вы сказали о том, чтобы не перезаписывать данные в родительских моделях, имеет смысл.... 17.08.2015
  • ... Если я могу немного уточнить, таблицы учителей нет, так как вся информация об учителях содержится в пользовательских таблицах. поэтому у меня есть... пользователи - id | урок_типы - id, user_id (помеченный как учитель_ид) только что посмотрел видео об отношениях, и теперь это имеет больше смысла... поэтому с моими текущими настройками я бы назвал $user-›lessonTypes. Но кажется неправильным называть это от пользователя, поскольку пользователи могут быть как родителями, так и учителями.... 17.08.2015
  • ... Должен ли я настроить таблицу учителей с: id (идентификатор учителя), user_id? тогда таблица уроков будет относиться к этой модели учителей, а не к таблице пользователей, поэтому у меня будет $teacher-›lessonTypes? Большое спасибо за рекомендуемое чтение, совершенно очевидно, что я просто погружаюсь в глубокий конец и учусь «на работе»! Тем не менее, это моя работа на сегодня, чтобы еще раз прочитать эти вещи :) Еще раз спасибо за вашу помощь и любую дальнейшую ясность, которую вы можете загрузить! 17.08.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

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


    Для любых предложений по сайту: [email protected]