Задать вопрос

Правильно ли я реализую паттерн Active Record?

Взялся в учебных целях написать простую реализацию паттерна Active Record, получился вот такой сервис. Собственно вопрос прост - правильно ли я всё делаю?

Итак, вот что я сделал.
Работу с базой инкапсулирует синглтон-класс DB. Он подключается к базе:
private function __construct() {
    $this->connect = new mysqli(self::HN, self::UN, self::PW, self::DB);
    $this->connect->query('SET NAMES utf8');
    mb_internal_encoding("UTF-8");
    if ($this->connect->connect_error) {
        die($conn->connect_error);
    }
}


и возвращает объект подключения:
public static function getConnection() {
    if (empty(static::$instance)) {
        static::$instance = new static();
    }
    return static::$instance->connect;
}


Данные конкретной книги обслуживает класс Book. Он возвращает свойства, необходимые для отображения характеристик книги, а также обновляет их, обращаясь для этого к классу BookManager:
public function update(array $data) {
    $result = BookManager::update($this->id, $data);
    $this->author = $result['author'];
    $this->title = $result['title'];
    $this->pages = $result['pages'];
    $this->price = $result['price'];
}


Класс BookManager, собственно, реализует Active Record. В нём хранятся запросы, необходимые для работы с базой:
private static $selectString = "SELECT * FROM books WHERE id = ?";
private static $multipleSelectString = "SELECT * FROM books ORDER BY id LIMIT ?, ?";
private static $updateString = "UPDATE books SET author = ?, title = ?, pages = ?, price = ? WHERE id = ?";
private static $insertString = "INSERT INTO books (author, title, pages, price) VALUES (?, ?, ?, ?)";
private static $countString = "SELECT COUNT(*) FROM books";


И методы для работы с этими запросами. Метод getBook находит данные книги по представленному id и возвращает соответствующий объект класса Book:
static public function getBook($id) {
    $resultSet = static::getData($id);

    return new Book(
        $resultSet['id'],
        $resultSet['author'],
        $resultSet['title'],
        $resultSet['pages'],
        $resultSet['price']
    );
}

static private function getData($id) {
    global $db;
    $stmt = $db->prepare(self::$selectString);

    $stmt->bind_param('i', $id);

    $stmt->execute();
    $result = $stmt->get_result();

    $resultSet = $result->fetch_assoc();

    return $resultSet;
}


Метод getCount возвращает общее количество книг в таблице:
static public function getCount() {
    global $db;

    $stmt = $db->prepare(self::$countString);
    $stmt->execute();

    $stmt->bind_result($count);
    $stmt->fetch();

    return $count;
}


Метод update обновляет данные в таблице:
static public function update($id, array $data) {
    global $db;
    $stmt = $db->prepare(self::$updateString);

    $stmt->bind_param('ssiii',
        $data['author'],
        $data['title'],
        $data['pages'],
        $data['price'],
        $id
    );

    $stmt->execute();

    $resultSet = static::getData($id);
    return $resultSet;
}


Ну и так далее.

Спасибо всем, кто откликнется.
  • Вопрос задан
  • 498 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
static это не ООП, global - давно не используется. static
Метод getCount возвращает общее количество книг в таблице

каждый экземпляр данного класса соответствует одной записи таблицы;
wiki/ActiveRecord
Явно не к месту.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы