每个人读这篇文章的好日子。我确实需要有关我正在进行的项目的建议。 我在PHP和MySQL编程方面比较陌生,我听说在项目上工作是提高技能的最好方法。
该项目是一个简单的公告项目,用户可以登录注册新的公告。 现在,每个公告都基于一个类别,例如生日,婚礼,社交活动,法庭听证等。
我目前关注的一件事是MYSQL表结构的样子。 例如,如果用户想要发送生日帖子,则所有用户点击都是生日并填写具有相关信息的表单。如果用户想要发布婚礼帖子,则用户点击婚礼并填写包含相关信息的表单。
但是,我采用这种设置的方式,每个公告都有不同的数据表。 即每种公告类型都存储在自己的表中。
例如,对于生日,我创建了一个带有BirthdaysController的生日模型
对于婚礼,我用WeddingsController创建了一个婚礼模型。
毕业时,我用GraduationController创建了一个毕业模型。
但是有些公告分享了类似名称,标题等类似的属性。
但是这会暗示重复很多代码,因为它们共享相似的属性,例如生日公告很可能类似于毕业公告。
我的第一个问题是如何限制我必须创建的表格数量并减少代码,因此它看起来不重复。
从我的角度来看,我的模型和控制器太多了。更重要的是,我发现我正在重复代码,并在"面向对象的训练营"从拉克拉斯特,我可以清楚地记得杰夫说这是一个不好的做法。 所以我真的在寻找一种更好的方法来做到这一点。 我知道这很冗长,但我需要帮助。
感谢。
答案 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
那只是通往罗马的另一条道路。