|
@@ -55,7 +55,8 @@ $comment->save();
|
|
|
|
|
|
### Класс
|
|
|
Класс наследник (`Posts` или `Comments` в примере выше) является сущностью, связанной с таблицей в СУБД.
|
|
|
-Класс должен уметь:
|
|
|
+
|
|
|
+Класс `Model` должен уметь:
|
|
|
- узнать структуру таблицы (`DESC TABLE`), используя позднее статическое связывание (имя таблицы в поле `$__table__`)
|
|
|
- исходя из структуры таблицы, узнать имя первичного ключа (может быть `id`, `post_id` и так далее)
|
|
|
- статический метод `getByPk` должен исходя из информации о структуры таблицы сформировать правильный запрос `SELECT * FROM <имя таблицы> WHERE <имя первичного ключа> = <параметр функции getByPk>`
|
|
@@ -63,7 +64,7 @@ $comment->save();
|
|
|
|
|
|
### Объект
|
|
|
Каждый объект класса является сущностью, связанной с конкретной записью в таблице
|
|
|
-Объект должен уметь:
|
|
|
+Объект `Model` должен уметь:
|
|
|
- используя магические `__set` и `__get` считывать и задавать поля записи из СУБД (`$post->title = 'POST TITLE'`)
|
|
|
- уметь сохраняться с помощью метода `save`. Метод `save` должен уметь исходя из известной структуры таблицы сформировать корректный `UPDATE` или `INSERT` для сохранения записи.
|
|
|
|
|
@@ -75,8 +76,10 @@ $comment->save();
|
|
|
Сделайте так, что бы имя первичного ключа у вас извлекался из СУБД с помощью `DESC TABLE` и в дальнейшем используйте его как статическую переменную, каждую для своего класса-наследника `Model`.
|
|
|
|
|
|
### Stage3
|
|
|
-- Добавьте флаг измененности записи (`dirty`) и не сохраняйте запись если она неизменна.
|
|
|
-- Добавьте **Identity Map**, для того, что бы объекты, полученные по одному и тому же первичному ключу не дублировались в памяти.
|
|
|
+- Добавьте флаг измененности записи (`dirty`) и не сохраняйте запись если она была изменена.
|
|
|
+- Добавьте **Identity Map**, для того, что бы объекты, полученные по одному и тому же первичному ключу не дублировались в памяти. **Identity Map** - механизм кэширования, который недопускает дублирования объектов, связанных с одной записью
|
|
|
+в СУБД в памяти. Это и более экономично по памяти, и уменьшает вероятность глюков рассинхронизации данных. Суть его проста: делаете в каждом классе `Model` статическое свойство - ассоциативный массив, ключами в котором являются idшник из
|
|
|
+таблицы, а значением будет объект. При запросах (`getByPk`, например) будет создаваться объект, он сохраняется в **Identity Map** и далее при повторных запросах *отдается уже существующий объект*.
|
|
|
|
|
|
### Пожелания и советы по реализации
|
|
|
#### Структура таблицы и имя первичного ключа:
|