Php Laravel中的元数据对象处理
我需要使用Laravel开发一个自定义表单生成器 这意味着将有一个GUI来选择和定制表单,如Php Laravel中的元数据对象处理,php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,我需要使用Laravel开发一个自定义表单生成器 这意味着将有一个GUI来选择和定制表单,如注册表或预订表单。用户应该能够添加/编辑/删除不同的表单控件,将其定义为必填项,等等 在这里,我有点困惑如何在后端处理这个问题。实现这一目标的更好方法是什么 或者我如何实现一个数据库体系结构来使用一些元数据表,这些元数据表可以用来处理多个项目,比如Wordpress,是否有任何内置的Laravel功能来处理这些元对象 在这种元数据方法中,insert/update/delete是如何处理的 在这里,插入在
注册表
或预订表单
。用户应该能够添加/编辑/删除不同的表单控件,将其定义为必填项,等等
在这里,我有点困惑如何在后端处理这个问题。实现这一目标的更好方法是什么
或者我如何实现一个数据库体系结构来使用一些元数据表,这些元数据表可以用来处理多个项目,比如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
}
- 类型和规则可以在另一个对象中重新组合,这样您就可以拥有可以管理的动态类型
- 列表可以有另一个存储选项和列表类型的对象(多选、单选)
firstname<