Laravel中的元数据对象处理

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).我们UserPost模型都将使用相同的功能来关联我们的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