Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Herança PHP e MySQL


Você basicamente tem três abordagens para esse problema (uma das quais eliminarei imediatamente):
  1. Uma mesa por aula (essa é a que vou eliminar);
  2. Um tipo de registro com colunas opcionais; e
  3. Um tipo de registro com uma tabela filha dependendo do tipo ao qual você se associa.

Por simplicidade, geralmente recomendo (2). Então, uma vez que você tenha sua mesa:
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  type VARCHAR(10),
  name VARCHAR(100)
);

onde o tipo pode ser 'AGENT' ou 'LEAD' (por exemplo). Alternativamente, você pode usar códigos de tipo de caractere. Você pode então começar a preencher os espaços em branco com o modelo de objeto:
  • Você tem uma classe pai User;
  • Você tem duas classes filhas:Lead e Agent;
  • Esses filhos têm um tipo fixo.

e deve se encaixar com bastante facilidade.

Quanto a como carregar em uma declaração, eu usaria algum tipo de fábrica. Assumindo essas 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);
  }
  ...
}

uma fábrica poderia ser assim:
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, você pode ter o método de fábrica como um método estático, digamos, na classe User e/ou usar uma tabela de pesquisa para os tipos de classes.

Talvez poluir as classes com o recurso de resultado da consulta como esse seja um design questionável no sentido OO mais estrito, mas é simples e funciona.