Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dziedziczenie PHP i MySQL

Zasadniczo masz trzy podejścia do tego problemu (jedno z nich natychmiast wyeliminuję):

  1. Jeden stół na klasę (to ten, który wyeliminuję);
  2. Typ rekordu z opcjonalnymi kolumnami; i
  3. Typ rekordu z tabelą podrzędną w zależności od typu, do którego się przyłączasz.

Dla uproszczenia generalnie polecam (2). Więc kiedy już masz swój stół:

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

gdzie typ może być 'AGENT' lub 'LEAD' (na przykład). Alternatywnie możesz użyć kodów jednoznakowych. Następnie możesz zacząć wypełniać puste miejsca modelem obiektowym:

  • Masz klasę nadrzędną użytkownika;
  • Masz dwie klasy podrzędne:Lead i Agent;
  • Te dzieci mają ustalony typ.

i powinien dość łatwo wskoczyć na swoje miejsce.

Co do tego jak załadować w jednym zestawieniu to bym użył jakiejś fabryki. Zakładając te klasy szkieletów:

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

fabryka może wyglądać tak:

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

Alternatywnie, możesz ustawić metodę fabryczną jako metodę statyczną na, powiedzmy, klasie User i/lub użyć tabeli przeglądowej dla typów do klas.

Być może zanieczyszczanie klas zasobem wyników zapytania w ten sposób jest wątpliwym projektem w najściślejszym sensie OO, ale jest to proste i działa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie aliasu kolumny w tej samej klauzuli SELECT

  2. Jak przekonwertować czas na strefę czasową urządzenia iPhone?

  3. DATEDIFF() lub BETWEEN dla zakresów dat w zapytaniach SQL

  4. Problem MySQL ODBC:nie znaleziono nazwy źródła danych i nie określono domyślnego sterownika

  5. Pole wyboru formularza PHP i niezdefiniowany indeks