sql >> データベース >  >> RDS >> Mysql

PHPの継承とMySQL

    この問題には基本的に3つのアプローチがあります(そのうちの1つはすぐに排除します):

    1. クラスごとに1つのテーブル(これは削除します);
    2. オプションの列を持つレコードタイプ。および
    3. 参加するタイプに応じて子テーブルを持つレコードタイプ。

    簡単にするために、私は一般的に(2)をお勧めします。したがって、テーブルができたら:

    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      type VARCHAR(10),
      name VARCHAR(100)
    );
    

    ここで、typeは「AGENT」または「LEAD」になります(たとえば)。または、1つの文字タイプコードを使用することもできます。次に、オブジェクトモデルを使用して空白の入力を開始できます。

    • ユーザーの親クラスがあります;
    • リードとエージェントの2つの子クラスがあります。
    • これらの子のタイプは固定されています。

    簡単に配置できるはずです。

    1つのステートメントでロードする方法については、ある種のファクトリを使用します。これらの最低限のクラスを想定する:

    class User {
      private $name;
      private $type;
      protected __construct($query) {
        $this->type = $query['type'];
        $this->name = $query['name'];
      }
      ...
    }
    
    class Agent {
      private $agency;
      public __construct($query) {
        parent::constructor($query);
        $this->agency = $query['agency'];
      }
      ...
    }
    
    class Lead {
      public __consruct($query) {
        parent::constructor($query);
      }
      ...
    }
    

    工場は次のようになります:

    public function loadUserById($id) {
      $id = mysql_real_escape_string($id);  // just in case
      $sql = "SELECT * FROM user WHERE id = $id";
      $query = mysql_query($sql);
      if (!query) {
        die("Error executing $sql - " . mysql_error());
      }
      if ($query['type'] == 'AGENT') {
        return new Agent($query);
      } else if ($query['type'] == 'LEAD') {
        return new Lead($query);
      } else {
        die("Unknown user type '$query[type]'");
      }
    }
    

    または、ファクトリメソッドをたとえばUserクラスの静的メソッドにするか、クラスの型のルックアップテーブルを使用することもできます。

    おそらく、そのようなクエリ結果リソースでクラスを汚染することは、厳密なOOの意味で疑わしい設計ですが、それは単純で機能します。



    1. EntityFrameworkを使用したAtomicIncrement

    2. Railsの移行:PostgreSQL上のBigintが失敗しているようですか?

    3. ディスクI/Oのボトルネックのトラブルシューティング

    4. MySQL LIMIT、OFFSETを使用したページネーション