dev*_*evo 2 php mysql laravel eloquent laravel-4
我需要使用Laravel开发自定义表单生成器.
这意味着将有一个GUI来选择和自定义表单,如.Registration Form或者Booking Form.User应该能够添加/编辑/删除不同的表单控件,将其定义为必需的等等.
在这里,我很难在后端处理这个问题.实现这一目标的更好方法是什么?
或者我如何实现数据库体系结构以使用一些元数据表来处理多个项目,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";}}
Run Code Online (Sandbox Code Playgroud)
Ste*_*e O 15
使用Laravel的Eloquent关系处理元数据表非常简单.假设您的数据库中有一个包含以下内容的用户表:
id email password created_at updated_at deleted_at
Run Code Online (Sandbox Code Playgroud)
如果您想保持简单并且不向用户表添加各种额外数据,您可以创建一个meta表,然后创建一个链接表user_meta来关联这两个数据.
但是,如果您还有一个posts表(与Wordpress一样)并且您的帖子也需要元数据呢?posts_meta我们可以使用Laravels Eloquent关系创建一些多态关系,而不是创建一个表来将你的帖子链接到他们的元.
这是我们的设置,以及我们的users表(上图),我们有一个posts表,其中包含以下字段:
id title content created_at updated_at deleted_at
Run Code Online (Sandbox Code Playgroud)
我们的meta表也遵循多态关系的指导原则:
id name value metable_id metable_type
//int meta key meta value post/user id resource ie post/user
Run Code Online (Sandbox Code Playgroud)
使用这个我们可以将帖子或用户的元数据添加到我们的元表中,如下所示:
id name value metable_id metable_type
------------------------------------------------------
1 nickname Steve 1 User
2 author Steve O 1 Post
Run Code Online (Sandbox Code Playgroud)
从数据库中获取此信息所需要做的就是定义各自模型中的关系.
所以现在我们已经准备好了DB,我们需要使用我们的多态关系设置我们的模型(一个用户模型,一个用于Post,一个用于Meta).我们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');
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们在元模型中定义这些关系的逆:
Meta.php
========================================
class Meta extends Eloquent {
public function metable()
{
return $this->morphTo();
}
}
Run Code Online (Sandbox Code Playgroud)
而已!
现在,您需要做的就是获取用户或帖子的元数据:
// Load in a post with an id of 1 and get all it's related meta
$post = Post::find(1);
$meta = $post->meta;
Run Code Online (Sandbox Code Playgroud)
如果我们要返回元对象,我们可能会看到类似的东西:
[{"id":2,"metable_id":1,"metable_type":"Post","name":"author","value":"Steve O"}]
Run Code Online (Sandbox Code Playgroud)
从这里你可以创建像这样的辅助函数来检查你所追求的元是否存在于结果中:
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
}
Run Code Online (Sandbox Code Playgroud)
在这里阅读更多关于Laravels Eloquent关系的文章:http://laravel.com/docs/eloquent-relationships