使用 Laravel 的 Eloquent 关系处理元数据表相当简单。假设您的数据库中有一个 users 表,其中包含:
id email password created_at updated_at deleted_at
如果您想保持简单而不是向您的用户表添加各种额外数据,您可以创建一个 meta 表,然后创建一个链接表 user_meta 将两者联系起来。
但是,如果您也有一个 posts 表(与 Wordpress 一样)并且您的帖子也需要元数据怎么办?我们可以使用 Laravel Eloquent 关系并创建一些 Polymorphic Relations,而不是创建一个 posts_meta 表来将您的帖子链接到他们的元数据。
数据库
这是我们的设置,除了我们的 users 表(上图),我们还有一个 posts 表,其中包含以下字段:
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
使用它,我们可以将帖子或用户的元数据添加到我们的元表中,如下所示:
id name value metable_id metable_type
------------------------------------------------------
1 nickname Steve 1 User
2 author Steve O 1 Post
从数据库中获取此信息所需要做的就是定义我们各自模型中的关系。
模型
所以现在我们已经准备好我们的数据库,我们需要使用我们的多态关系设置我们的模型(一个用于用户,一个用于 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');
}
}
现在我们在元模型中定义这些关系的逆:
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
}
在此处的文档中阅读有关 Laravel Eloquent 关系的更多信息:http://laravel.com/docs/eloquent-relationships