Laravel:针对不同公告类型

时间:2017-03-10 12:40:41

标签: php mysql laravel database-design

每个人读这篇文章的好日子。我确实需要有关我正在进行的项目的建议。 我在PHP和MySQL编程方面比较陌生,我听说在项目上工作是提高技能的最好方法。

该项目是一个简单的公告项目,用户可以登录注册新的公告。 现在,每个公告都基于一个类别,例如生日,婚礼,社交活动,法庭听证等。

我目前关注的一件事是MYSQL表结构的样子。 例如,如果用户想要发送生日帖子,则所有用户点击都是生日并填写具有相关信息的表单。如果用户想要发布婚礼帖子,则用户点击婚礼并填写包含相关信息的表单。

但是,我采用这种设置的方式,每个公告都有不同的数据表。 即每种公告类型都存储在自己的表中。

例如,对于生日,我创建了一个带有BirthdaysController的生日模型 对于婚礼,我用WeddingsController创建了一个婚礼模型。
毕业时,我用GraduationController创建了一个毕业模型。

但是有些公告分享了类似名称,标题等类似的属性。

但是这会暗示重复很多代码,因为它们共享相似的属性,例如生日公告很可能类似于毕业公告。

我的第一个问题是如何限制我必须创建的表格数量并减少代码,因此它看起来不重复。

从我的角度来看,我的模型和控制器太多了。更重要的是,我发现我正在重复代码,并在"面向对象的训练营"从拉克拉斯特,我可以清楚地记得杰夫说这是一个不好的做法。 所以我真的在寻找一种更好的方法来做到这一点。 我知道这很冗长,但我需要帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

我个人会利用MySQL的关系功能(它是一个关系数据库)。

如果您可以为每种公告类型识别属性的超集 - 即所有公告类型的所有属性组合成一个唯一列表,那么请将其作为公告表。

e.g。

announcement_id: a unique id for each announcement. can just be an auto incremented number
announcement_date: date
announcement_type: (see below)
announcement_title: the announcement headline / title
announcement_detail: the detail text for the announcement
announcement_user: name of the person adding the announcement (think about user lists and authentication and things for this as well...)

然后添加一个announcements_type表格,其中包含您在公告表中允许的不同类型的公告:

announcement_type_id: a type id could just be a single letter, e.g B=Birthday, G=Graduation,W=Wedding.
announcement_type_description: a user friendly name for the announcement type, e.g Birthday, Graduation, Wedding

因此,您的两个表中的记录可能是:

类型表:

id    description
W     Wedding
B     Birthday
G     Graduation

公告表:

id    date       type  title                     detail                                                        user
1     18090212   B     Abe Lincoln's birthday    Birthday of the 16th US president                             John Doe
2     19810729   W     Royal Wedding             Wedding of Prince Charles and Diana Spencer in London   Fred Bloggs

这并不是一个完整的解决方案,但希望能给你一些想法......

答案 1 :(得分:0)

虽然你说你是初学者,但我认为选择这样的挑战意味着你能胜任这项任务。

您希望发布公告,其中每种类型可能(或可能不)具有一些额外的列。我建议为所有公告创建一个表,因为它们共享一些属性(标题,类型,描述,日期,状态等)。

因此,您将所有常用字段放在同一个表中,然后创建一个名为'announcement_data'或'extra'或任何您想要的表格。我会称之为额外的解释。

Extra belongsTo Announcement&公告hasMany Extra。然后当您保存公告时,根据类型,您将在表单中显示一些额外的字段,例如:'见证','新娘'等。您可以从控制器获取它们

public function save(Request $request)
{
    $announcement = Announcement::create([
        'title' = $request->title,
        'type' => $request->type,
        ... //all common fields (description, status, date, etc.)
    ]);

    //save extra fields
    //according to the type of event, you should find a way to know which extra field is needed e.g:

    //assuming it's a wedding
    $announcement->extra()->saveMany([
        new Extra(['field' => 'bride', 'value' => $request->bride]),
        new Extra(['field' => 'groom', 'value' => $request->groom])
    ]);
}

以后如何显示数据?

@foreach($announcement->extra as $extra)
    {{ $extra->field }} : {{ $extra->value }}
@endforeach

那只是通往罗马的另一条道路。