Mysql
 sql >> Database >  >> RDS >> Mysql

Ereditarietà PHP e MySQL

Fondamentalmente hai tre approcci a questo problema (uno dei quali eliminerò immediatamente):

  1. Una tabella per classe (questa è quella che eliminerò);
  2. Un tipo di record con colonne opzionali; e
  3. Un tipo di record con una tabella figlio a seconda del tipo a cui ti unisci.

Per semplicità generalmente raccomando (2). Quindi una volta che hai il tuo tavolo:

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

dove il tipo può essere 'AGENT' o 'LEAD' (ad esempio). In alternativa è possibile utilizzare codici di un tipo di carattere. Puoi quindi iniziare a riempire gli spazi vuoti con il modello a oggetti:

  • Hai una classe genitore Utente;
  • Hai due classi figlio:Lead e Agent;
  • Quei bambini hanno un tipo fisso.

e dovrebbe andare a posto abbastanza facilmente.

Per quanto riguarda come caricare in una dichiarazione, userei una sorta di fabbrica. Assumendo queste classi barebone:

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

una fabbrica potrebbe assomigliare a questa:

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

In alternativa, potresti fare in modo che il metodo factory sia un metodo statico, ad esempio, sulla classe User e/o utilizzare una tabella di ricerca per i tipi nelle classi.

Forse inquinare le classi con la risorsa del risultato della query in questo modo è un progetto discutibile nel senso più stretto di OO, ma è semplice e funziona.