Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP-Vererbung und MySQL

Sie haben grundsätzlich drei Ansätze für dieses Problem (von denen ich einen sofort eliminiere):

  1. Ein Tisch pro Klasse (diesen werde ich eliminieren);
  2. Ein Datensatztyp mit optionalen Spalten; und
  3. Ein Datensatztyp mit einer untergeordneten Tabelle, abhängig vom Typ, dem Sie beitreten.

Der Einfachheit halber empfehle ich generell (2). Sobald Sie also Ihren Tisch haben:

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

wobei der Typ beispielsweise „AGENT“ oder „LEAD“ sein kann. Alternativ können Sie auch einstellige Typcodes verwenden. Sie können dann beginnen, die Lücken mit dem Objektmodell zu füllen:

  • Sie haben eine Benutzer-Elternklasse;
  • Sie haben zwei untergeordnete Klassen:Lead und Agent;
  • Diese Kinder haben einen festen Typ.

und es sollte sich leicht einfügen lassen.

Was das Laden in einer Anweisung betrifft, würde ich eine Art Factory verwenden. Angenommen diese Barebone-Klassen:

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

eine Fabrik könnte so aussehen:

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

Alternativ könnten Sie die Factory-Methode eine statische Methode auf, sagen wir, der User-Klasse sein lassen und/oder eine Nachschlagetabelle für die Typen zu Klassen verwenden.

Vielleicht ist es ein fragwürdiges Design im strengsten OO-Sinne, die Klassen mit der Abfrageergebnis-Ressource zu verschmutzen, aber es ist einfach und funktioniert.