Laravel 5在运行时动态生成的Eloquent模型

时间:2015-06-02 21:59:57

标签: laravel orm eloquent laravel-5

我希望制作一些扩展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)这样的事情,并获得一个正常运作的“产品”实例。这可能,甚至可取吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:-1)

你看过Migrations(是Schema Builder)吗?它允许您以编程方式构建模型(如果需要,可以使用JSON)。

然后你可以在你的查询中利用Eloquent ......