在Laravel

时间:2017-05-20 10:06:40

标签: php database laravel

我目前正在尝试在Laravel中构建一个非常简单的CMS,这样我就有了一个基本的entities表(和模型),其结构如下:

{
    id: int,
    slug: string
}

以及其他几个表格(pagesblogposts等),其结构类似于以下内容:

{
    id: int,
    title: string,
    content: string,
    entity_id: int
}

想法是应用程序获取URL,找到与slug匹配的实体,然后找到相应的PageBlogpost

这是我无法弄清楚如何实现的最后一步。我应该在model_name表中添加entities列,以便知道要查询哪个Model吗?我已经研究过多态关系,但我认为它们不一定是我想要的,因为这是一对一的关系。

1 个答案:

答案 0 :(得分:0)

要回答您的问题,您需要这样做。

在Page和BlogPost模型中

public function entity()
{
    return $this->hasOne('App\Entity');
}

在实体模型中

public function page()
{
    return $this->belongsTo('App\Page');
}

public function blogPost()
{
    return $this->belongsTo('App\BlogPost');
}

控制器逻辑

$entity = Entity::where('slug', $slug)->firstOrFail();
$page = $entity->page;
$blogPost = $entity->blogPost;

// OR

$page = Page::whereHas('entity', function ($query) use ($slug) {
    $query->where('slug', $slug);
})->get();

$blogPost = BlogPost::whereHas('entity', function ($query) use ($slug) {
    $query->where('slug', $slug);
})->get();

但理想情况下这是一个糟糕的实现。您应该使用多态关系将页面或博客文章的ID存储在实体表中。然后在使用slug过滤后使用此参考页面或博客文章。

您可以将实体表重命名为slug以使其更有意义。

slugs
    id - integer
    name - string
    slugable_id - integer
    slugable_type - string

这使您无需检查实体是否有页面或博客帖子,并直接获取相关模型。