Php Laravel中的元数据对象处理

Php Laravel中的元数据对象处理,php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,我需要使用Laravel开发一个自定义表单生成器 这意味着将有一个GUI来选择和定制表单,如注册表或预订表单。用户应该能够添加/编辑/删除不同的表单控件,将其定义为必填项,等等 在这里,我有点困惑如何在后端处理这个问题。实现这一目标的更好方法是什么 或者我如何实现一个数据库体系结构来使用一些元数据表,这些元数据表可以用来处理多个项目,比如Wordpress,是否有任何内置的Laravel功能来处理这些元对象 在这种元数据方法中,insert/update/delete是如何处理的 在这里,插入在

我需要使用Laravel开发一个自定义表单生成器

这意味着将有一个GUI来选择和定制表单,如
注册表
预订表单
。用户应该能够添加/编辑/删除不同的表单控件,将其定义为必填项,等等

在这里,我有点困惑如何在后端处理这个问题。实现这一目标的更好方法是什么

或者我如何实现一个数据库体系结构来使用一些元数据表,这些元数据表可以用来处理多个项目,比如
Wordpress
,是否有任何内置的Laravel功能来处理这些元对象

在这种元数据方法中,
insert/update/delete
是如何处理的

在这里,插入在元表中应该只有一行。假设在用户注册时,没有将
firstname
lastname
保存在元表中的单独行中,它应该在一行中使用类似的一些对象

a:3:{s:9:"firstname";s:10:"irshad.far";s:8:"lastname";s:0:"";s:5:"_meta";a:7:{s:2:"ip";s:10:"14.99.80.3";s:9:"confirmip";s:10:"14.99.80.3";s:11:"confirmtime";d:1407932201;s:8:"signupip";s:10:"14.99.80.3";s:10:"signuptime";d:1407932201;s:4:"lang";s:2:"en";s:4:"form";s:7:"unknown";}}

Metadataobjects本身将保存在一个表中。但就性能而言,我认为这些对象应该有自己的数据表

方法1)

这些类型的表单需要预定义并链接到特定的控制器。这必须是或,以便每种类型的表单(如注册)只有一个控制器,并且在任何时候都只能使用一个用户定义的metadataobject。该控制器的table参数将被设置为指向专门为该metadataobject创建的数据库表(或者可以根据元数据迁移相同的表,但该表应为空)

或者2)每个metadataobject都应该创建自己的控制器,该控制器指向对象的数据表

在每个进近中,需要创建路线,以指向每次使用的每种类型的一个控制器

一个难题是如何管理这些对象的修订。可能每个对象都有一个运行的数字后缀,并创建了自己的控制器和数据表(这样,即使是已填充的表,也可能更容易迁移[然后,如果用户的操作会导致数据丢失,例如删除表单数据字段时,会在前端通知用户])

该项目的另一部分是创建一个智能生成器引擎,用于根据metadataobject组装HTML、CSS和JS代码。生成的代码可以保存在与对象本身相同的表中,并且在使用时应该缓存在后端以呈现视图


这种元数据对象本身必须有一种巧妙的格式,以便它由预定义的设置组成,这些设置将由表单生成器代码转换为功能。

使用Laravel的雄辩关系处理元数据表是相当直接的。假设数据库中有一个users表,其中包含:

id    email    password    created_at    updated_at    deleted_at
如果您希望保持简单,并且不向用户表中添加各种额外数据,您可以创建一个
表,然后创建一个链接表
用户元
,将两者关联起来

但是,如果您还有一个
posts
表(与Wordpress一样),并且您的帖子也需要元数据,该怎么办?我们可以使用Laravels雄辩的关系并创建一些链接,而不是创建一个
posts\u meta
表来将您的帖子链接到他们的meta


数据库 这是我们的设置,连同我们的
用户
表(上图),我们有一个
帖子
表,其中包含以下字段:

id    title    content    created_at    updated_at    deleted_at
我们还有我们的
meta
表,该表遵循多态关系的指导原则:

id      name        value         metable_id      metable_type
//int   meta key    meta value    post/user id    resource ie post/user
使用此功能,我们可以将帖子或用户的meta添加到meta表中,如下所示:

id    name       value      metable_id    metable_type
------------------------------------------------------
1     nickname   Steve      1             User
2     author     Steve O    1             Post
要从数据库中获取这些信息,我们需要做的就是在各自的模型中定义关系


模型 现在我们已经准备好了数据库,我们需要用多态关系设置模型(一个模型用于用户,一个模型用于Post,一个模型用于元)。我们的
User
Post
模型都将使用相同的函数来关联我们的
Meta
模型:

User.php
========================================

class User extends Eloquent {
    public function meta()
    {
        return $this->morphMany('Meta', 'metable');
    }
}


Post.php
========================================

class Post extends Eloquent {
    public function meta()
    {
        return $this->morphMany('Meta', 'metable');
    }
}
现在,我们在元模型中定义这些关系的倒数:

Meta.php
========================================

class Meta extends Eloquent {
    public function metable()
    {
        return $this->morphTo();
    }
}
就这样


获取数据 现在,要获取用户或帖子的元数据,只需执行以下操作:

// Load in a post with an id of 1 and get all it's related meta
$post = Post::find(1);
$meta = $post->meta;
如果我们返回元对象,我们可能会看到如下内容:

[{"id":2,"metable_id":1,"metable_type":"Post","name":"author","value":"Steve O"}]

向前! 从这里,您可以创建类似这样的帮助函数,用于检查结果中是否存在您要查找的元:

public function hasMeta($key)
{
    $meta = $this->meta;

    foreach ($meta as $item):
        if( $item->name == $key ) return true;
    endforeach;

    return false;
}

// Use it like:
if($post->hasMeta('author')){
    // Display author
}


在这里的文档中阅读有关Laravels雄辩关系的更多信息:

我曾经做过类似的事情,我的方法是构建一个小型数据库引擎,其中表单类似于表格,数据类似于行:

描述表格结构和设计的表格:

Form {
    id,
    title,
    layout,
    ...
}
具有类型和验证规则的表单字段

Field {
    formId,
    name,
    type (String, Date, Image, Integer, Double, List, ...),
    pattern (Regex validation maybe),
    ...
}
表单中插入的数据是属于该表单的行

Row {
    id,
    formId,
}
每一行都是对应表单字段的一组条目,可以按照预定义规则进行验证

Entry {
    rowId,
    fieldId,
    value
}
  • 类型和规则可以在另一个对象中重新组合,这样您就可以拥有可以管理的动态类型
  • 列表可以有另一个存储选项和列表类型的对象(多选、单选)

谢谢,我将在第二天尝试此方法并向您提供最新信息。我认为此方法简单明了。我不指望有什么先进的方法。当我检查某个wordpress插件时,它将与实体相关的所有数据存储在一行中,如下所示:a:3:{s:9:“firstname”;s:10:“irshad.far”;s:8:“lastname”;s:0:;s:5:“meta”;a:7:{s:2:“ip”;s:10:“14.99.80.3”;s:10:“confirmip”;s:11:“confirmtime”;d:1407932201;s:8:“signupip”;s:10:“14.99.80.3”;s:10:“正常运行时间”;d:1407932201;s:4:“lang”;s:2:“en”;s:4:“form”;s:7:“unknown”}。他们还提取每个项目,比如
firstname<