ActiveRecord своїми руками на PHP

Доброго часу доби! Я працюю над веб-проектом X. Проект великий, складний і перспективний. Але, як і в будь-якому іншому проекті, є багато коду, написаного наспіх з позначкою «коли-небудь виправлю».

Настав час виправляти.

Читаючи черговий мануал, я виявив шаблон проектування «Active Record». Простий запит в Google, і ось вже подруга Вікіпедія коротко і ясно розповіла про все (https://ru.wikipedia.org/wiki/ActiveRecord). Зміст шаблону простий: для роботи з таблицями в базі даних вирішено було створити спеціальний клас, який би виконував всі основні дії (CRUD).

Ось все, що потрібно для підключення: помістимо в масив $dbConfig (тут буде 5 елементів):
host, user, pass, db, table.

Нехай функція setConfigDB заповнить потрібними значеннями $dbConfig.

protected $dbConfig = array();

function setConfigDB($host, $user, $pass, $db, $table) {
$this->dbConfig["host"] = $host;
$this->dbConfig["user"] = $user;
$this->dbConfig["pass"] = $pass;
$this->dbConfig["db"] = $db;
$this->dbConfig["table"] = $table;
}

Тепер створимо метод підключення до БД:

protected function init_connected_db() {
mysql_connect($this->dbConfig["host"], $this->dbConfig["user"], $this->dbConfig["pass"]);
mysql_select_db($this->dbConfig["db"]);
mysql_query("SET NAMES cp1251");
}

Тут все як у книжці. Єдине, що mysql_query(«SET NAMES cp1251»); дозволить читати дані в потрібній кодуванні. База даних налаштована на цю кодування.
Я не став вибирати якісь особливі імена, не став дотримуватися іменування CRUD (Create, Update, Delete), а як писав є.
Для того щоб вставити запис будемо використовувати цю функцію:

insert function($keys, $values) {
$table = $this->dbConfig["table"];
$query = "INSERT INTO $table (";
foreach ($keys as $value) {
$query.="$value, ";
}

$query = substr($query, 0, -2);
$query.=") VALUES (";
foreach ($values as $value) {
$query.="$value, ";
}
$query = substr($query, 0, -2);
$query.=");";
$this->init_connected_db();
mysql_query($query);
}

Головне потім треба не забути, що тут у якості параметрів передаються масиви. Foreach працює з ними, а без нього проблемно створити запит з кількома полями і відповідними значеннями. Параметр $key у нас приймає імена полів, параметр $value — значення, які треба записати у відповідні поля. У функції два циклу, спочатку пишемо всі поля, а потім все значення. Користуючись стандартними можливостями PHP, щоб отримати потрібну нам рядок. В кінці підключаємося до БД і виконуємо запит. Підключення до БД приховано, щоб програміст лише передав потрібну інформацію в метод.

Для читання даних таблиці будемо використовувати дві функції selectAll() і select($fields). За змістом їх можна об'єднати в одну, але за фактом простіше створити дві.

function selectAll() {
$table = $this->dbConfig["table"];
$query = "SELECT * FROM $table;";
$this->init_connected_db();
return $result = mysql_query($query);
}

select function($fields) {
$table = $this->dbConfig["table"];
$query = "SELECT ";
foreach ($fields as $value) {
$query.="$value, ";
}
$query = substr($query, 0, -2);
$query.=" FROM $table";

$this->init_connected_db();
return $result = mysql_query($query);
}

Так як інструкція SELECT поверне нам результат, то у return помістимо $result = mysql_query($query);
Далі видалення.

function delete($key, $value) {
$table = $this->dbConfig["table"];
$query = "DELETE FROM $table WHERE $key=$value;";
$this->init_connected_db();
return $result = mysql_query($query);
}

Метод — одноразовий. Один виклик — видалена одна рядок. Відомо, що оператор DELETE повертає число видалених рядків, для зручності повернемо їх return $result = mysql_query($query);.
Тепер оновимо наші записи в табличці:

function update($key, $value, $where_key, $where_value) {
$table = $this->dbConfig["table"];
$query = "UPDATE $table SET $key =$value WHERE $where_key=$where_value;";
$this->init_connected_db();
return $result = mysql_query($query);
}

Функція містить 4 вхідних параметра $key, $value, $where_key, $where_value. Може здатися, що їх занадто багато, але з іншого боку інструкція UPDATE досить детальна.

Так от, $key=$value це те, що ми помістимо на місце старої запису, а $where_key і $where_value це те, де нам шукати. Тобто: знаходимо рядок з полем $where_key значення якого дорівнює $where_value, в ній записуємо значення $value в поле $key. Начебто складно, але якщо прочитати команду SQL, то відразу стає зрозумілим, що до чого.
Клас готовий, тепер попрацюємо з примірником:

Створимо новий об'єкт, запишемо все необхідне для подальшої роботи:

$ar = new ActiveRecord(); 
$ar->setConfigDB("localhost", "root", "", "prime", "tableland sangre grande"); 

Далі вставимо запис в табличку:

$fields = array("text");
$values = array("'Привіт!'");
$ar->insert($fields, $values); 

Не забуваємо, що метод insert в якості параметрів передаються масиви.
Давайте тепер подивимося, що у нас вийшло в таблиці:

$result = $ar->selectAll(); 

Для перегляду результату, як у підручниках напишемо цикл:

while ($row = mysql_fetch_array($result)) {

echo " || " . $row['id'] . " => " . $row['text'];
}

Тут я спеціально не став шукати і придумувати способи виведення даних, так як основне завдання нашого класу саме робота з БД. Введення даних програміст сам сформує як йому треба, ну або сверстает окремий клас для цього.
Тепер проведемо вибірку по конкретних полів. В моєму випадку одне.

$fields = array('id');
$result = $ar->select($fields); 

while ($row = mysql_fetch_array($result)) {
echo $row['id'] . "; ";
}

Що-небудь видалимо:

$ar->delete( "text","'Привіт!'"); 
$result = $ar->selectAll();

І оновимо:

$ar->update("text", "'Поки!'", "id", 57); .

Загалом все. Вийшло те, що хотілося б вважати прийнятним для роботи. Відносити цей клас до справжнім Active Record чи ні, не знаю. Але впевнений, що в настільки простої, а місцями навіть невигадливої реалізації, його можна застосовувати у простих проектах. А якщо гарненько попрацювати над ним, то і в складних йому знайдеться місце.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.