我目前正在尝试在Laravel中构建一个非常简单的CMS,这样我就有了一个基本的entities
表(和模型),其结构如下:
{
id: int,
slug: string
}
以及其他几个表格(pages
,blogposts
等),其结构类似于以下内容:
{
id: int,
title: string,
content: string,
entity_id: int
}
想法是应用程序获取URL,找到与slug匹配的实体,然后找到相应的Page
,Blogpost
等
这是我无法弄清楚如何实现的最后一步。我应该在model_name
表中添加entities
列,以便知道要查询哪个Model
吗?我已经研究过多态关系,但我认为它们不一定是我想要的,因为这是一对一的关系。
答案 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
这使您无需检查实体是否有页面或博客帖子,并直接获取相关模型。