2015-06-02 4 views
1

Я ищу, чтобы сделать какой-то класс «GenericModel», расширяющий класс Eloquent Model, который может загружать конфигурацию базы данных (например, соединение, имя таблицы, столбец первичного ключа), а также отношения во время выполнения на основе файла конфигурации JSON.Laravel 5 Яркая модель, динамически генерируемая во время выполнения

Мои причины для этого следующие: у меня будет много таблиц базы данных и, следовательно, много моделей, но у большинства на самом деле нет сложной логики. Я разработал общий API CRUD и интерфейсный интерфейс для взаимодействия с ними. Каждая модель имеет связанный с ней файл «плана» JSON, который описывает такие вещи, как его атрибуты и отношения. Это позволяет мне автоматически генерировать, скажем, представление для создания новой модели, и она знает, какие атрибуты мне нужно заполнить, какие элементы ввода использовать, что их обозначать, которые являются обязательными, как проверять, следует ли проверять уникальность и т. д., не требуя при этом кода, специфичного для этой модели. Вот пример, project.json:

{ 
    "db_table": "projects", 
    "primary_key": "projectid", 
    "display_attr": "title", // Attribute to display when picking row from list, etc 
    "attributes": { 
     "projectid": { // Attribute name matches column name 
      "display": "ID", // Display this to user instead of db column name 
      "data_type": "integer" // Can be integer, string, numeric, bool... 
     }, 
     "title": { 
      "data_type": "string", 
      "unique": true // Check for uniqueness when validating field 
     }, 
     "customer": { 
      "data_type": "integer", // Data type of local key, matches customer PK 
      "relationship": { // Relationship to a different model 
       "type": "manytoone", 
       "foreign_model": "customer" 
      }, 
      "user": "autocomplete" // User input element/widget to use, queries customer model for matches as user types 
     }, 
     "description": { 
      "data_type": "string", 
      "user": "textarea" // Big string, use <textarea> for user input 
      "required": false // Can be NULL/empty, default true 
     } 
    }, 
    "views": { 
     "table": [ // Show only these attributes when viewing table 
      "customer", 
      "title" 
     ], 
     "edit_form": [ // Show these when editing 
      "customer", 
      "title", 
      "description" 
     ], 
     ... 
    } 
} 

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

Я действительно хотел бы сделать что-то вроде GenericModel::blueprint('project.json')->find($id) и получить действующий экземпляр «продукта». Возможно ли это или даже желательно? Или есть лучший способ сделать это?

+0

'GenericModel' может продлить' Eloquent', и таким образом вы могли прочитать конфигурацию в конструкторе и установить соответствующие значения. Вы также можете создать статический метод 'blueprint()', который будет возвращать правильно созданный экземпляр «GenericModel». НО, одна проблема - как вы рассказываете обо всем этом? то есть. Как вы знаете, этот экземпляр для таблицы X вместо таблицы Y? Это не может быть большой проблемой, в зависимости от вашей схемы базы данных. – Kryten

+0

Другой вопрос/беспокойство ... если ваши таблицы настолько похожи, что вы можете это сделать, зачем вообще беспокоиться о Красноречии? Вы явно не используете отношения. Может быть, вы могли бы просто создать свой собственный класс модели ... – Kryten

+0

@Kryten - Я действительно начал создавать класс GenericRepository, который просто возвращал массивы для строк таблицы (достаточно хорошо, когда мой контроллер только генерирует ответы JSON), но чувствовал себя как Я изобретал колесо. Я точно не использую Eloquent для его полного потенциала, но он по-прежнему предлагает множество удобств, которые я хотел бы использовать. Ваш комментарий о том, что вы не знаете, какая таблица является экземпляром, действительна, но я не уверен, что это создаст проблему для меня. Однако я определенно использую отношения. – JaredL

ответ

-1

Вы посмотрели Migrations (был ли построитель схем)? Он позволяет вам программировать модели (от JSON, если необходимо).

Тогда вы могли бы использовать красноречивый на запросах ...

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