Я ищу, чтобы сделать какой-то класс «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)
и получить действующий экземпляр «продукта». Возможно ли это или даже желательно? Или есть лучший способ сделать это?
'GenericModel' может продлить' Eloquent', и таким образом вы могли прочитать конфигурацию в конструкторе и установить соответствующие значения. Вы также можете создать статический метод 'blueprint()', который будет возвращать правильно созданный экземпляр «GenericModel». НО, одна проблема - как вы рассказываете обо всем этом? то есть. Как вы знаете, этот экземпляр для таблицы X вместо таблицы Y? Это не может быть большой проблемой, в зависимости от вашей схемы базы данных. – Kryten
Другой вопрос/беспокойство ... если ваши таблицы настолько похожи, что вы можете это сделать, зачем вообще беспокоиться о Красноречии? Вы явно не используете отношения. Может быть, вы могли бы просто создать свой собственный класс модели ... – Kryten
@Kryten - Я действительно начал создавать класс GenericRepository, который просто возвращал массивы для строк таблицы (достаточно хорошо, когда мой контроллер только генерирует ответы JSON), но чувствовал себя как Я изобретал колесо. Я точно не использую Eloquent для его полного потенциала, но он по-прежнему предлагает множество удобств, которые я хотел бы использовать. Ваш комментарий о том, что вы не знаете, какая таблица является экземпляром, действительна, но я не уверен, что это создаст проблему для меня. Однако я определенно использую отношения. – JaredL