我希望制作一些扩展Eloquent Model
类的“GenericModel”类,它可以根据配置加载数据库配置(如连接,表名,主键列)以及运行时关系JSON文件。
我想要这个的原因如下:我将拥有大量的数据库表,因此有很多模型,但大多数都没有任何复杂的逻辑。我开发了一个通用的CRUD API和前端接口来与它们进行交互。每个模型都有一个与其关联的“蓝图”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 :(得分:-1)
你看过Migrations(是Schema Builder)吗?它允许您以编程方式构建模型(如果需要,可以使用JSON)。
然后你可以在你的查询中利用Eloquent ......