2016-06-27 7 views
2

に挿入し、これはプログラミングの分野での私の1年目であると私はプログラミングではまだ新しいです。私はここで家系図の設計に関するいくつかの他の記事を読みましたが、私はあなたの助けを必要とするので、私はまだいくつかの詳細を理解していませんでした。ところで、私はPHPデータベースファミリーのデザインとどのようにデータベース

を使用し、これは私の簡易版フォーム

// family leader 
<div id="family_leader"> 
    <input type="text" name="name[]"> 
    <input type="text" name="ic[]"> // ic is the same like SSN 
</div> 

// family member 
// here input wife or child info 
// i use javascript to clone the div so user can add how many family member they have. 
<div id="family_member"> 
    <input type="text" name="name[]"> 
    <input type="number" name="ic[]"> 
    <input type="text" name="relationship[]"> 
</div> 

であり、私は、データベースを作るの

第一の表は、

次のようになりますこのように思っていますユーザテーブル

+--------+--------------+--------------+ 
| id |  name  |  ic  | 
+--------+--------------+--------------+ 
| id1 | John   | 9357906268 | 
+--------+--------------+--------------+ 
| id2 | Josh   | 9357222228 | 
+--------+--------------+--------------+ 

とi wi彼らの関係のために別のテーブルを持っているでしょう

関係表誰もジョシュ

  • ジョシュの父親/母親は、テーブルは次のようになります

    ジョン

  • に父親ではありません

    • この

      +-------------+--------------+--------------+ 
      | owner_id | family_id | relationship | 
      +-------------+--------------+--------------+ 
      | ic1/id1 | ic2/id2 | father  | 
      +-------------+--------------+--------------+ 
      | ic2/id2 | ic1/id1 | child  | 
      +-------------+--------------+--------------+ 
      

      i makeそのような

      夫は1妻 父持っている1または多数の子 子供がとても1人の父

      を持っていた

      単一の親の場合には、私は、このデータが見えるようにしたいプロファイルにもこの方法ここまでは、私が得たものである

      家族クラス

      <?php 
      /** 
      * this is my family class 
      */ 
      class Family 
      { 
      
          function __construct(argument) 
          { 
           # database construct here 
          } 
      
          public function getUser($_POST) 
          { 
           foreach ($_POST['name'] as $row) { 
            # this is how im going to insert the data of user into user table 
            $sql1="INSERT INTO User (name, ic) values (" $_POST[name][i]", "$_POST[ic][i]")" // e.g John, 9357906268 
           } 
          } 
      
          public function getRelation($_POST) 
          { 
           $sql2="INSERT INTO Relationship (owner_id, family_id, relationship) values ($_POST['ic'][i], $_POST['ic'][1], $_POST['relationship'][i])" 
      
           /** 
           * this is where my problem reside 
           * i don't know how to make this function 
           */ 
          } 
      } 
      

      2番目のテーブルに正しく挿入するにはどうすればいいですか?

      私もgetRelation

      switch ($_POST['relation']) { 
          case 'father': 
           // in here is if Josh is a father to John then John is a child to Josh. 
           break; 
      
          case 'mother': 
           # code... 
           break; 
      
          // ... more case 
      
          default: 
           # code... 
           break; 
      } 
      

      または多分クラスでより多くの機能を作成して内部のスイッチケースをやってと思っていますか?

      public function isFather($value='') 
      { 
          # code... 
      } 
      
      public function isMother($value='') 
      { 
          # 
      } 
      

      問題は、ユーザーの関係を決定するために、機能やスイッチのケース内でロジックを実行する方法がわかりません。

      、これはデータベースの設計とOOPの正しい方法は何ですか?

      はあなたの時間をありがとうございました。

    答えて

    2

    、これはデータベース設計の正しい方法は何ですか?

    小修正:Userに主キーを定義し、Relations.owner_idRelations.family_idでそれを使用します。これらの2つの列にFOREIGN KEY制約を追加します。

    また、family_leaderが実際に母親であるため、ユーザーの性別を保存する必要があります。

    文字列としてRelations.relationshipを格納すると、何百万ものレコードがある場合でもパフォーマンス上の問題が発生する可能性がありますが、学習タスクでは問題ありません。 MySQLではフィールド値を文字列の固定リストに制限するために使用できるCHECK Constraintがあります。 CHECK relationship IN('father', 'son', 'daughter','wife','husband')

    これはあなたがここにfamily_leaderとfamily_memberを混合している私の簡易版フォーム

    です:私はあなたのHTMLコードにマイナーな問題を注意したい次の質問に答える前に

    <div id="family_leader"> 
        <input type="text" name="family_leader[name]"> 
        <input type="text" name="family_leader[ic]"> // ic is the same like SSN 
    </div> 
    
    <div class="family_member"> <!-- don't use id if you're gonna duplicate this div --> 
        <input type="text" name="name[]"> 
        <input type="number" name="ic[]"> 
        <input type="text" name="relationship[]"> <!-- consider using <select> tag here to limit possible relationhips --> 
    </div> 
    

    とOOPを:それはそれらを分離良いですか?

    小さなメモ:getUsergetRelationを使用しています。 「取得」とは、変更せずにどこかからデータを取得していることを意味します。関数がデータを挿入するときは、saveUser(とsaveRelation)の名​​前を付ける必要があります。

    は今、あなたは尋ねた:

    問題は、私は、ユーザーの関係を決定するために機能 またはスイッチケース内部のロジックを実行する方法を確認していないです。

    私はOOPのアプローチを以下の推薦:以下Userクラスを作成します。

    <?php 
    
    class User { 
        public $id; 
        public $name; 
        public $ic; 
    
        public function save() { 
         // save the user to the db and update $this->id with autogenerated id 
        } 
    
        public function addChild(User $child) { 
         // add to `Relations`: [$this->id, $child->id, 'father'] 
         // then add to `Relations`: [$child->id, $this->id, 'child'] 
        } 
    
        public function addWife(User $wife) { 
         // check if this user already has a wife and throw an Exception "Wife already exists" 
         // 
         // add to `Relations`: [$this->id, $wife->id, 'husband'] 
         // then add to `Relations`: [$wife->id, $this->id, 'wife'] 
        } 
    
        public function addRelative($relationship, User $relative) { 
         switch ($relationship) { 
          case 'child': 
           $this->addChild($relative); 
           break; 
    
          case 'wife': 
           $this->addWife($relative); 
           break; 
    
          default: 
           throw new Exception("Unknown relationship:" . $relationship); 
           break; 
         } 
        } 
    } 
    

    その後、Familyクラスの使用で機能次

    public function saveFamily() { 
        $family_leader = new User() 
        $family_leader->name = $_POST['family_leader']['name']; 
        $family_leader->ic = $_POST['family_leader']['ic']; 
        $family_leader->save(); 
    
        foreach ($_POST['name'] as $i => $name) { 
         $family_member = new User(); 
         $family_member->name = $name; 
         $family_member->ic = $_POST['ic'][$i]; 
         $family_member->save(); 
    
         try { 
          $family_leader->addRelative($_POST['relationship']['$i'], $family_member); 
         } catch (Exception $e) { 
          die ('Relationship not added:' . $e->getMessage()); 
         } 
        } 
    } 
    
    +0

    あー感謝を!私は今これを試みます。 –

    +0

    このようにファミリークラスを使用しますか? '$ファミリー=新しいファミリー(); \t $ family = saveFamily(); 'クラスは$ _POSTを取得しますか? –

    +0

    'Family'クラスの中で' saveFamily() 'を定義し、' $ family = new Family(); $ family-> saveFamily(); '将来、あなたは[メソッド連鎖](https://en.wikipedia.org/wiki/Method_chaining#PHP)のような素敵なテクニックを探すかもし​​れません –

    関連する問題