sql >> Base de Datos >  >> RDS >> Mysql

Herencia de PHP y MySQL

Básicamente, tiene tres enfoques para este problema (uno de los cuales eliminaré de inmediato):

  1. Una mesa por clase (esta es la que eliminaré);
  2. Un tipo de registro con columnas opcionales; y
  3. Un tipo de registro con una tabla secundaria según el tipo al que se una.

Por simplicidad, generalmente recomiendo (2). Así que una vez que tengas tu mesa:

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

donde el tipo puede ser 'AGENTE' o 'LEAD' (por ejemplo). Alternativamente, puede usar códigos de tipo de un carácter. Luego puede comenzar a completar los espacios en blanco con el modelo de objeto:

  • Tiene una clase principal de usuario;
  • Tiene dos clases secundarias:Líder y Agente;
  • Esos niños tienen un tipo fijo.

y debería encajar en su lugar con bastante facilidad.

En cuanto a cómo cargar en una declaración, usaría algún tipo de fábrica. Asumiendo estas clases básicas:

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 fábrica podría verse así:

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

Alternativamente, puede hacer que el método de fábrica sea un método estático en, por ejemplo, la clase de Usuario y/o usar una tabla de búsqueda para los tipos de clases.

Quizás contaminar las clases con el recurso de resultado de la consulta de esa manera es un diseño cuestionable en el sentido más estricto de OO, pero es simple y funciona.