Я знаю, что это старый вопрос сейчас, но все еще актуален сегодня для многих людей.
Мой способ преодоления этого точного сценария состоит в том, чтобы иметь базовый моделер, который содержит все основные взаимодействия с таблицами:
<?php
class base {
/**
* @name $table_values
* @description This holds all data about the table including the field names and data for the record loaded.
* @example {
* "primary_keys" : [],
* "table_data" : {
* "name" : "value",
* "name" : "value"
* }
* }
*/
private $table_values = array();
/**
* @name __get
* @param $name The name of the property to return.
* @description The PHP magic getter.
*/
public function __get($name) {
$keys = array_keys($this->table_values['table_data']);
if (in_array($name, $keys)) {
return $this->table_values['table_data'][$name];
}
}
/**
* @name __set
* @param $name The name of the property to set.
* @param $value The value to assign to the property.
* @description The PHP magic setter.
*/
public function __set($name, $value) {
$this->table_values['table_data'][$name] = $value
}
/**
* @name table_name
* @description Must override in child class. Should return the name of the table to use.
*/
public function table_name() {}
/**
* @name load
* @param $ids int|array Can be a single primary key or an assoc array of primary keys depending on the table with the keys for the array being the field names.
* @description This method handles loading a single record from the table and storing it as a PHP object.
*/
public function load($ids) {
// Use the primary key(s) to find and load the record into $table_values from the database.
}
/**
* @name save
* @description Saves the record in the database
public function save() {
// Use the primary key(s) to find and either insert or update the database table record.
}
}
?>
Используйте базовый класс как:
<?php
class person extends base {
public function table_name() {
return "person";
}
}
class car extends base {
public function table_name() {
return "car";
}
}
?>
и т.д.
Использование и автозагрузчик для автоматической загрузки классов и обработки, когда класс не существует для таблицы:
<?php
spl_autoload_register(function($class_name) {
$filename = "/path/to/class/{$class_name}.php";
if (class_exists($class_name)) {
// Do nothing.
} elesif (file_exists($filename)) {
require_once($filename);
} else {
// Check if the class name exists in the database as a table.
if ($database->table_exists($class_name)) {
$class_def = "
class {$class_name} extends base {
public function table_name() {
return \"{$class_name}\";
}
}";
eval($class_def);
}
}
});
?>
Базовый класс может иметь гораздо больше функциональности. У меня также есть функции, которые можно переопределить в дочерних элементах, чтобы выполнять действия до и после загрузки и сохранения, а также проверять наличие дублирующихся записей, например, с такими же данными.