Mysql
 sql >> Base de données >  >> RDS >> Mysql

Héritage PHP et MySQL

Vous avez essentiellement trois approches pour résoudre ce problème (dont une que j'éliminerai immédiatement) :

  1. Une table par classe (c'est celle que j'éliminerai );
  2. Un type d'enregistrement avec des colonnes facultatives ; et
  3. Un type d'enregistrement avec une table enfant selon le type auquel vous vous joignez.

Pour plus de simplicité, je recommande généralement (2). Donc une fois que vous avez votre table :

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

où type peut être 'AGENT' ou 'LEAD' (par exemple). Vous pouvez également utiliser des codes de type à un caractère. Vous pouvez alors commencer à remplir les blancs avec le modèle d'objet :

  • Vous avez une classe parent Utilisateur ;
  • Vous avez deux classes enfants :Lead et Agent ;
  • Ces enfants ont un type fixe.

et il devrait se mettre en place assez facilement.

Quant à savoir comment charger dans une seule instruction, j'utiliserais une sorte d'usine. En supposant ces classes barebones :

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);
  }
  ...
}

une usine pourrait ressembler à ceci :

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]'");
  }
}

Alternativement, vous pouvez faire en sorte que la méthode de fabrique soit une méthode statique sur, par exemple, la classe User et/ou utiliser une table de recherche pour les types des classes.

Peut-être que polluer les classes avec la ressource de résultat de requête comme ça est une conception discutable au sens OO le plus strict, mais c'est simple et ça marche.