我目前正在尝试在 Laravel 中构建一个非常简单的 CMS,这样我就有了一个基本entities
表(和模型),其结构如下:
{
id: int,
slug: string
}
以及其他几个表(pages
、blogposts
等),其结构类似于以下内容:
{
id: int,
title: string,
content: string,
entity_id: int
}
这个想法是,应用程序获取URL,发现蛞蝓匹配的实体,然后找到相应的Page
,Blogpost
等等。
这是我无法弄清楚如何实现的最后一步。我是否应该model_name
向entities
表中添加一列,以便知道Model
要查询哪一列?我研究了多态关系,但我认为它们不一定是我要寻找的,因为这在很大程度上是一对一的关系。
要回答您的问题,您需要这样做。
在 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 过滤后使用它引用页面或博客文章。
您可以将实体表重命名为 slugs 以使其更有意义。
slugs
id - integer
name - string
slugable_id - integer
slugable_type - string
这使您无需检查实体是否有页面或博客文章并直接获取相关模型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句