Мой сайт

Сайт обо всем по порядку

WpFatFree. Модели.


Тут особо и говорить не о чем. Потому как структуру моделей я почти полностью позаимствовал из примеров с гитхаба. Некоторые модернизации были произведены, но это скорее касалось удобства и не касалось самой сути. Фреймворк располагает достаточно удобными инструментами для работы с базой данных и не воспользоваться ими было бы глупо. А так как запросы к базе достаточно простые, то этот путь становится совсем очевидным.
В общем случае работа с базой данных сводится к следующему. Определяем класс, в конструкторе которого определяем базу данных и таблицу, с которой предстоит работать.

class Blogpost extends DB\SQL\Mapper {
    public function __construct(DB\SQL $db) {
        parent::__construct($db, 'posts');
    }
}

В конструкторе есть возможность выбрать поля, которые будут участвовать в запросе. Я отказался от этого, потому как у меня не вышло манипулировать этой возможностью. К примеру, если в первом запросе я выбираю одни поля, а в следующем запросе меняю набор полей – запрос не меняется. Я смотрел по логам. Он даже не выполняется. Используется предыдущий запрос. 
Разбираться я не стал, в силу моего поверхностного знания баз данных и решил выбирать всю таблицу. Поискав по готовым решениям, никто этой возможностью не пользуется. И я решил, чем я лучше. Ну вот собственно этот класс и обладает всеми методами, которые мне лично были необходимы. Тем более, что всегда можно обратиться напрямую к PDO. Для примера. Запись в таблицу прямо из массива POST.

/*  Insert reccord  */
    public function add() {
        $this->copyFrom('POST');
        $this->save();
    }

Проще не придумаешь. Но такое вроде бы неудобство, обращается впоследствии в идеальную читаемость кода. Сюда спокойно можно подставить и массив. Естественно все поля, предназначенные для записи, должны точно совпадать с полями в таблице.

/* Вставка записи через массив */
    public function addArray($arr) {
        $this->copyFrom($arr);
        $this->save();
    }

На выходе простого запроса на выборку всех записей, получается просто огромный класс. Может он для чего- то и нужен. Скорее определенно нужен, но я пока не представляю зачем. Но при желании можно легко получить обычный массив.

public function all() {
        $data = array();
        for ($this->load(); !$this->dry(); $this->next())
        $data[] = $this->cast();
        return $data;
    }

Просто замечательная возможность заменить индексы массива на табличное ID или другое уникальное поле. Вывод дополнительной информации (автор, категория) в шаблоне станет намного проще.

public function fieldId($key) {
        $data = array();
        for ($this->load(array()); !$this->dry(); $this->next())
            $data[] = $this->cast();
        $dataKey = array();
        foreach ($data as $k => $v) {
                $dataKey[$v[$key]] = $v;
                unset($dataKey[$v[$key]][$key]);
        }
        $data = $dataKey;
        return $data;
    }

Кроме того, в запрос можно очень просто добавить поле из другой таблицы. Так называемые виртуальные поля.

 $model = new \Blogpost($this->database);
        $model->author=
        'SELECT login FROM users '.
        'WHERE users.id = posts.user_id';
        $model->category=
        'SELECT name FROM categories '.
        'WHERE categories.id = posts.cat_id';

 
Ну и так далее. Всего не упомнишь.
Как я уже говорил, можно просто из любого места кода выполнить обычный запрос.  Даже цепочку запросов.

$db->exec(
    array(
        'DELETE FROM diet WHERE food="cola"',
        'INSERT INTO diet (food) VALUES ("carrot")',
        'SELECT * FROM diet'
    )
);

Но если вначале у меня было пару таких запросов, то впоследствии я со всем справился посредством класса Mapper. 
Немного выбивается из общей канвы пагинация. Но и там все достаточно прозрачно и понятно даже мне.