【发布时间】:2014-10-04 16:23:17
【问题描述】:
这是我(在 Laravel 中)构建的第一个应用程序,它不是教程中的“待办事项”列表,我正在寻找实现某些数据库逻辑的最佳方法。
我正在构建一个应用程序,用户可以在其中创建页面和子页面。但是,有不同类型的页面模板,例如:
- 音频:(用于嵌入 Soundcloud)
- 视频:(用于嵌入 YouTube)
每个模板都可以使用自定义名称和 slug 多次使用,这意味着您可以拥有多个标题为“tracks”或“mixes”的音频模板。
前端的 URL 结构如下:
website.com/username/mixes/ - 显示混合列表
website.com/username/mixes/name-of-mix - 直接转到每个混音
在管理区域,用户将遵循以下路径
添加新页面(简单链接)
选择一个模板(例如音频或视频)
选择音频模板并将其命名为 Mixes(前端 website.com/username/mixes)
返回到新创建的(但为空)混音页面
用户点击“添加新音频项”
创建一个名为“混音名称”的新音频项
这会强制 slug 的前第一部分为 /mixes/ 和 然后在末尾添加“name-of-mix”。
用户可以对“混音”页面重复多次。
以上所有我都可以实现(在 Laravel 的控制器中)。
我遇到的问题是在数据库中实现此功能的最佳/最干净的方法是什么?
我...
选项一 - - - - - - - - - - - - - - - - - - -
保存页面模型中的每个页面和子页面,并从中引用模板(如果是子页面),例如:
登陆页面(website.com/username/mixes)
新页面:
- id: 1
- user_id: 1
- format: audio
- format_id: null
- template: audio_landing
- title: Mixes
- slug: mixes
单页(website.com/username/mixes/name-of-mix)
保存后,它将创建一个页面并创建一个单独的音频项目
新音频:
- id: 6
- user_id: 1
- title: Name of mix
- embed_code: 7654365
新页面:
- id: 2
- user_id: 1
- format: audio
- format_id: 6
- template: audio_single
- title: null (title is on the audio model)
- slug: mixes/name-of-mix
那么在我看来,我会打电话给 website.com/{username}/{slug}
查询只会扫描 User 模型(针对用户名),然后是 Pages 模型,在找到正确的 slug 时停止,然后引用关联的 Audio 模型并为该页面创建一个视图。这(我认为)将是获取页面信息的一种更快且强度更低(在 MySQL 上)的方式。
我的想法是否正确,从Pages模型中,我可以使用“format: audio”搜索Audio模型并使用“format_id: 6”将其匹配到模型“id: 6”
选项二 - - - - - - - - - - - - - - - - - - -
在 Pages 中保存页面,然后在 Audio 模型中保存子页面
登陆页面(website.com/username/mixes)
新页面:
- id: 1
- user_id: 1
- template: audio_landing
- title: Mixes
- slug: mixes
单页(website.com/username/mixes/name-of-mix)
这将直接保存在音频模型中
新音频:
- id: 6
- user_id: 1
- template: audio_single
- title: Name of mix
- embed_code: 7654365
- slug: mixes/name-of-mix
那么在我看来,我会打电话给 website.com/{username}/{slug}
缺点(我认为)是查询必须在找到正确的 slug 之前搜索页面、音频、视频、演出、博客、事件等模型。我想这会在每次加载页面请求时对数据库非常密集?
抱歉有点跑题了,欢迎任何建议。
杰克。
【问题讨论】:
标签: php mysql laravel-4 logic eloquent