2017-03-10 6 views
1

誰もがこれを読んで良い日です。私が取り組んでいるプロジェクトについてアドバイスが必要です。 私はPHPとMySQLでプログラミングするのが比較的新しいので、プロジェクトでの作業は自分のスキルを磨く最善の方法だと聞いています。Laravel:異なるアナウンスメントタイプのための単一または複数のmysqlテーブル

プロジェクトは、ユーザーが新しいアナウンスをログイン登録できる簡単なアナウンスプロジェクトです。 今、各アナウンスメントはカテゴリに基づいています。誕生日、結婚式、社会的機能、聴聞会など

私は現在、どのようにMYSQLのテーブル構造がどのように見えるかについています。 たとえば、ユーザーが誕生日の投稿を作成する場合、すべてのユーザーのクリックは誕生日で、関連情報を含むフォームが入力されます。ユーザーが結婚式の投稿をしたい場合、ユーザーは結婚式をクリックし、関連情報を含むフォームを記入する。

ただし、私はこの設定をしている方法で、私は各アナウンスごとに異なるデータテーブルを持っています。 すなわち、各アナウンスタイプはそれ自身のテーブルに格納される。

たとえば、BirthdaysControllerでBirthdayモデルを作成しました
結婚式では、私はWeddingsControllerで結婚式モデルを作成しました。
卒業生は、GraduationControllerで卒業モデルを作成しました。

しかし、発表の一部には、名前、タイトルなど

のような類似した属性を共有する。しかし、彼らは、例えば同様の属性を共有しているため、これはしかし、多くのコードを繰り返す暗示します誕生日の発表は、卒業発表とほとんど同じようになります。

私の最初の質問は、作成してコードを減らして繰り返し見た目を変えないようにするためのテーブルの数を制限する方法です。

私の見地からは、あまりにも多くのモデルとコントローラがあります。さらに、私はコードを繰り返していますが、Laracastの "Object Oriented Boot Camp"では、ジェフがこれは悪い習慣であると鮮明に覚えています。 私は本当にこれを行うより良い方法を探しています。 これはかなり長いことがわかりますが、私はこれについて助けが必要です。

ありがとうございました。

+0

私はそれらを分離することは絶対にうまくいくと思います。 2つ目は、アナウンスの詳細情報を追加する必要があります。アナウンスが分かれていると本当にうれしいでしょう。いくつかのフィールドが共有されている場合、私はこれらの情報を共有する複雑なシステムを作るのに十分な理由だとは思わない。 – devk

答えて

1

個人的には、MySQLのリレーショナル機能(リレーショナルデータベース)を利用したいと思います。

アナウンスメントタイプごとに属性のスーパーセット、つまりすべてのアナウンスタイプのすべての属性を一意のリストにまとめたものを識別できる場合は、これをアナウンステーブルにします。

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 

あなたの二つのテーブル内のレコードは、したがって、次のようになります。

Typesテーブル:

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 

これは完全なソリューションであることを意図されていませんが、あなたが初心者だったと述べたが、うまくいけば...あなた

0

をいくつかのアイデアを与えるだろう、私はそのような挑戦を選択すると、あなたが最大であることを意味だと思いますタスク。

アナウンスをしたいと思っています。それぞれのタイプに余分な列があるかもしれません。いくつかの属性(タイトル、タイプ、説明、日付、ステータスなど)を共有しているため、すべてのアナウンスのテーブルを1つ作成することをお勧めします。

共通のフィールドをすべて同じテーブルに入れて、 'announcement_data'や 'extra'などのテーブルを作成します。私はこの説明のためにExtraと呼ぶことにする。

Extra belongsToアナウンス&アナウンス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 

これは、ローマに通じる別の道だった。

+0

このデザインで見られる問題は、a)タイトルを正規化している可能性がありますが、実際には(実際には)フィールド値が重複して繰り返されるような方法で、 over b)多くのデータ型に最適化されていないテキストとして保存されたすべての値があります。 – devk

関連する問題