Mysql
 sql >> база данни >  >> RDS >> Mysql

Наследяване на PHP и MySQL

По същество имате три подхода към този проблем (един от които ще премахна незабавно):

  1. Една таблица на клас (това е тази, която ще премахна);
  2. Тип запис с незадължителни колони; и
  3. Тип на запис с дъщерна таблица в зависимост от типа, към който се присъединявате.

За простота обикновено препоръчвам (2). Така че, след като имате вашата маса:

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

където типът може да бъде "АГЕНТ" или "ВОД" (например). Като алтернатива можете да използвате кодове от един символен тип. След това можете да започнете да попълвате празните места с обектния модел:

  • Имате родителски клас User;
  • Имате два дъщерни класа:водещ и агент;
  • Тези деца имат фиксиран тип.

и би трябвало да си дойде на мястото доста лесно.

Що се отнася до това как се зарежда в едно изявление, бих използвал някакъв фабричен. Ако приемем тези 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);
  }
  ...
}

една фабрика може да изглежда така:

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

Като алтернатива, можете да накарате фабричния метод да бъде статичен метод, да речем, на класа User и/или да използвате таблица за търсене за типовете към класовете.

Може би замърсяването на класовете с ресурса на резултатите от заявката по този начин е съмнителен дизайн в най-строгия OO смисъл, но е прост и работи.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. INSERT INTO с SubQuery MySQL

  2. mysql преместване на ред между таблици

  3. Как да представите данни по осите X и Y в SQL таблица

  4. Преобразуване на mysql в mysqli - как да получите обект на суперглобална връзка?

  5. SQL:Вземете записи, които отговарят на условията, идващи от множество записи