2017 © Pedro PelΓ‘ez
 

library db

DB is part of SQRT Framework

image

sqrt-pro/db

DB is part of SQRT Framework

  • Saturday, April 9, 2016
  • by sqrt-pro
  • Repository
  • 2 Watchers
  • 0 Stars
  • 1,247 Installations
  • PHP
  • 4 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 4 Versions
  • 2 % Grown

The README.md

DB

Build Status Coverage Status Latest Stable Version License, (*1)

Π Π°Π±ΠΎΡ‚Π° с Π±Π°Π·ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° двумя способами - Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ прямых запросов Π² Π‘Π”, ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ., (*2)

ВСрминология \ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ классы:, (*3)

  • Manager - ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π₯Ρ€Π°Π½ΠΈΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π‘Π”, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, ΠΈ прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ прямыС запросы ΠΊ Π‘Π”.
  • Schema - ОписаниС структуры Π‘Π”, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Repository, Item.
  • Repository - ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Π‘Π” ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Item.
  • Collection - Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Item, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π΅ интСрфСйс доступа ΠΊ массиву, ΠΈ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ.
  • Item - ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ запись Π² Π‘Π” ΠΈ содСрТащий бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ с Π½ΠΈΠΌ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π‘Π”

Настройки ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ хранятся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Manager, ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄:, (*4)

~~~ php $manager->addConnection($host, $user, $pass, $db_name, $db_charset = 'utf8', $connection_name = null);, (*5)


Если Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ имя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ присвоСно имя default, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ~~~ php $manager->getConnection($name = null); // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ PDO

Для удобства разворачивания ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… условиях Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ хостинга прСдусмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ прСфикс для всСх Ρ‚Π°Π±Π»ΠΈΡ†, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ:, (*6)

~~~ php $manager->setPrefix($prefix);, (*7)


Π’ΠΎΠ³Π΄Π° всС создаваСмыС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅, Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ с этим прСфиксом. **Π’Π°ΠΆΠ½ΠΎ!** Π’ запросах, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, прСфикс Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ! ## ΠŸΡ€ΡΠΌΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с Π‘Π” Из ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Manager ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ PDO ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ запросы Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для получСния Π΄Π°Π½Π½Ρ‹Ρ…. ВсС значСния, подставляСмыС Π² запрос рСкомСндуСтся ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· PDO-плСйсхолдСры Π²ΠΈΠ΄Π° `WHERE id = :id`, Π° сами значСния ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ $values. Π’ качСствС запроса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ строку, ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Query, создаваСмый [QueryBuilder`ΠΎΠΌ](https://github.com/sqrt-pro/QueryBuilder). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Query ΠΈ подставлСны Π² запрос автоматичСски. ~~~ php // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос Π² Π‘Π”, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ \PDOStatement $manager->query($sql, $values = null, $connection = null) // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС записи Π² Π²ΠΈΠ΄Π΅ списка ассоциативных массивов. Если ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ $key, значСния этого столбца Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ списка. $manager->fetchAll($sql, $key = null, $values = null, $connection = null) // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ строку Π² Π²ΠΈΠ΄Π΅ ассоциативного массива $manager->fetchOne($sql, $values = null, $connection = null) // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки ΠΎΡ‚Π²Π΅Ρ‚Π°. $col - имя столбца, ΠΈΠ»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ столбца Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅. $manager->fetchValue($sql, $col = null, $values = null, $connection = null) // Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ столбСц ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ этого столбца $manager->fetchColumn($sql, $col = null, $values = null, $connection = null) // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ массив Π²ΠΈΠ΄Π° ΠΊΠ»ΡŽΡ‡ => Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· запроса $manager->fetchPair($sql, $values = null, $connection = null) // ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ $callable ΠΊΠΎ всСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. // ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ массив содСрТащий Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ строку $callable($row) $manager->each($sql, $callable, $values = null, $connection = null)

Π’ цСлях ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх выполняСмых запросов:, (*8)

~~~ php $manager->setDebug($debug = true); // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ, (*9)

$manager->getQueries(); // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… запросов, {query:..., values:..., time:...} $manager->getQueriesCount(); // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ запросов ΠΊ Π‘Π” $manager->getQueriesTime(); // Π‘ΡƒΠΌΠΌΠ°Ρ€Π½ΠΎΠ΅ врСмя выполнСния запросов ΠΊ Π‘Π”, (*10)


## Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с транзакциями ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Manager ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: ~~~ php $manager->beginTransaction($connection = null); // ΠΠ°Ρ‡Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° соСдинСнии $connection $manager->commit($connection = null); // ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° соСдинСнии $connection $manager->rollback($connection = null); // ΠžΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π½Π° соСдинСнии $connection $manager->inTransaction($connection = null); // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π°ΠΊΡ‚ΠΈΠ²Π½Π° Π»ΠΈ транзакция Π½Π° соСдинСнии $connection

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

~~~ php $manager->transaction(\Closure $closure, $connection = null); // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ $closure Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π° соСдинСнии $connection, (*11)


ΠžΠ±ΡŠΠ΅ΠΊΡ‚ `$closure` Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ с СдинствСнным Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ `Manager`. ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ выполнСния транзакция Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π°, послС выполнСния Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° (`commit`) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния `$closure`. Если `$closure` Π²Ρ‹ΠΊΠΈΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, тразакция Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π° (`rollback`) ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Ρ€ΠΎΡˆΠ΅Π½ΠΎ Π΄Π°Π»Π΅Π΅. ## Π‘Ρ…Π΅ΠΌΠ° Π‘Ρ…Π΅ΠΌΠ° содСрТит логичСскоС прСдставлСниС ΠΏΠΎΠ»Π΅ΠΉ Π² Π‘Π” ΠΈ ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². По схСмС Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ автоматичСски ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ, Π² сравнСнии с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ состояниСм Π‘Π”. Настройки схСмы производятся Ρ‡Π΅Ρ€Π΅Π· наслСдованиС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса схСмы ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² `init()` ΠΈ `relations()` Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»Π΅ΠΉ: ~~~ php $schema->addInt($col, $default = 0, $signed = true, $length = 10) $schema->addBool($col) $schema->addChar($col, $length = 255) $schema->addFloat($col, $length = 10, $decimals = 2, $signed = false) $schema->addText($col, $size = false) $schema->addTime($col, $unix = true) $schema->addTimeCreated($col = 'created_at') $schema->addTimeUpdated($col = 'updated_at')

Π’Π°ΠΆΠ½ΠΎ! Π’Π°Π±Π»ΠΈΡ†Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ addTimeCreated ΠΈΠ»ΠΈ addTimeUpdated, Ρ‚.ΠΊ. MySQL Π½Π΅ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΠ»Π΅ΠΉ с CURRENT_TIME. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° addTime, (*12)

ΠšΡ€ΠΎΠΌΠ΅ "ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ…" ΠΏΠΎΠ»Π΅ΠΉ, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ поля содСрТащиС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ., (*13)

~~~ php // ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ $schema->addId($col = 'id'), (*14)

// ПолС INT ΠΈ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маской $schema->addBitmask($col, array $options, $default = 0), (*15)

// ПолС ENUM, содСрТащСС Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² $schema->addEnum($col, array $options, $default = null), (*16)

// ПолС TEXT, содСрТащСС сСриализованный массив Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ Ρ„Π°ΠΉΠ»Π΅ $schema->addFile($column), (*17)

// ПолС TEXT, содСрТащСС сСриализованный массив Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ $schema->addImage($column, array $size_arr = null), (*18)


## ГСнСрация Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ORM По схСмС гСнСрируСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹\сСттСры для всСх ΠΏΠΎΠ»Π΅ΠΉ, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΈΡ… Ρ‚ΠΈΠΏΠ°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля\ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹\константы. ### Π”Π°Ρ‚Ρ‹ * Π‘Π΅Ρ‚Ρ‚Π΅Ρ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‹ Π² любом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ `strtotime()` ~~~ php $item->setCreatedAt('2015-01-01 12:45'); $item->setCreatedAt('-7 days'); ~~~ * Π“Π΅Ρ‚Ρ‚Π΅Ρ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ date() ~~~ $item->getCreatedAt(false, 'd.m.Y H:i'); ~~~ ### Float * Π“Π΅Ρ‚Ρ‚Π΅Ρ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `number_format()` ~~~ php $item->getPrice(); // 12345.67 $item->getPrice(false, 1, ',', ' '); // 12 345,7 ~~~ ### ENUM ПолС ENUM содСрТит список допустимых ΠΎΠΏΡ†ΠΈΠΉ для поля. НапримСр: ~~~ php $schema->addEnum('status', array('new', 'progress', 'done'));
  • Для всСх ΠΎΠΏΡ†ΠΈΠΉ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ константы Π²ΠΈΠ΄Π° [column]_[value], Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ STATUS_NEW, STATUS_DONE.
  • Π‘ΡƒΠ΄Π΅Ρ‚ сгСнСрирован массив ΠΈΠΌΠ΅Π½ для констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ классС ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ чСловСкопонятныС ΠΈΠΌΠ΅Π½Π°, (*19)

    ~~~ php protected static $status_arr = array( self::STATUS_NEW => 'new', self::STATUS_PROGRESS => 'progress', self::STATUS_DONE => 'done', ); ~~~, (*20)

  • ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π² сСттСр Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚ Π² массивС ΠΈΠΌΠ΅Π½, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, (*21)

  • Π‘ΡƒΠ΄ΡƒΡ‚ сгСнСрированы Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:
    • Π“Π΅Ρ‚Ρ‚Π΅Ρ€ Π²ΠΈΠ΄Π° get[column]Name(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ имя значСния, содСрТащССся Π² массивС ΠΈΠΌΠ΅Π½.
    • БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ Get[column]Arr(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ массив ΠΈΠΌΠ΅Π½
    • БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ GetNameFor[column]($status), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ имя для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ значСния

Bitmask - битовая маска

Битовая маска позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· списка ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΠ»Π΅. ЗначСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ числовоС прСдставлСниС Π² Π²ΠΈΠ΄Π΅ стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ. ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ENUM Π² возмоТности ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сразу нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ., (*22)

~~~ php $schema->addBitmask('status', array('payed', 'delivered', 'happy')), (*23)


* Для всСх ΠΎΠΏΡ†ΠΈΠΉ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ константы Π²ΠΈΠ΄Π° `[column]_[value]`, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ констант Π±ΡƒΠ΄Π΅Ρ‚ присвоСно ΠΊΠ°ΠΊ 2 Π² стСпСни ΠΊΠ»ΡŽΡ‡ массива (0, 1, 2, ...). ~~~ php const STATUS_PAYED = 1; const STATUS_DELIVERED = 2; const STATUS_HAPPY = 4; ~~~ * Π‘ΡƒΠ΄Π΅Ρ‚ сгСнСрирован массив ΠΈΠΌΠ΅Π½ для констант, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ классС ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ чСловСкопонятныС ΠΈΠΌΠ΅Π½Π° ~~~ php protected static $status_arr = array( self::STATUS_PAYED => 'payed', self::STATUS_DELIVERED => 'delivered', self::STATUS_HAPPY => 'happy', ); ~~~ * Π‘Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²: ~~~ php $item->addStatus(Item::STATUS_PAYED); $item->setStatus(array(Item::STATUS_PAYED, Item::STATUS_HAPPY)); ~~~ * Π“Π΅Ρ‚Ρ‚Π΅Ρ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив: ~~~ php $item->getStatus(); // [1, 4] ~~~ * ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, установлСн Π»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π»Π°Π³: ~~~ php $item->hasStatus(Item::STATUS_PAYED); ~~~ **Π’Π°ΠΆΠ½ΠΎ!** НС слСдуСт Π·Π»ΠΎΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маской для хранСния часто ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π΄Π°Π½Π½Ρ‹Ρ…. Для этого слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ связь ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΈ внСшниС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹-справочники. ### File Виповая Π·Π°Π΄Π°Ρ‡Π° сохранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ этого Ρ„Π°ΠΉΠ»Π°. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΈ этом Π½Π΅ трСбуСтся поиска ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этих Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ Π‘Π”, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ Π½Π° Π΄Π΅Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ процСсс. ~~~ php $schema->addFile('pdf')

Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ TEXT, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ сСриализованный массив свойств Ρ„Π°ΠΉΠ»Π°., (*24)

  • Π‘Π΅Ρ‚Ρ‚Π΅Ρ€ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ запись ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ выполняСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ setFilesPath()
  • Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ Π½Π° всС свойства Ρ„Π°ΠΉΠ»Π° Π²ΠΈΠ΄Π° get[column][property], Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для column = "pdf"
    • getPdf($default = false) - ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ. ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅ Π½Π° сСрвСрС задаСтся Ρ‡Π΅Ρ€Π΅Π· setPublicPath() ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
    • getPdfPath($default = false) - ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π½Π° сСрвСрС
    • getPdfUrl($default = false) - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ URL, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ Π½Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ
    • getPdfSize($human = true) - Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°. Если $human == true, примСняСтся Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
    • getPdfName($default = false) - Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°
    • getPdfExtension($default = false) - Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

Image

Виповая Π·Π°Π΄Π°Ρ‡Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ изобраТСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ½ΠΎΠ³Π΄Π° с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… ΠΈ\ΠΈΠ»ΠΈ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ водяного Π·Π½Π°ΠΊΠ°, Π° Ρ‚Π°ΠΊΠΆΠ΅ сохранСниСм Π΅Π³ΠΎ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ…., (*25)

~~~ php $schema->addImage('image', array('thumb', 'medium', 'orig');, (*26)


Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ TEXT, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ сСриализованный массив свойств Ρ„Π°ΠΉΠ»Π°. * Π‘Π΅Ρ‚Ρ‚Π΅Ρ€ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ запись ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ выполняСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `setFilesPath()`. * ΠŸΡ€ΠΈ сохранСнии Ρ„ΠΎΡ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² вызываСтся ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ `prepareImageFor[column]($file, $size)`, Π³Π΄Π΅ size - ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² схСмС. Если этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `SQRT\Image`, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ сохранСно ΠΈΠ· Π½Π΅Π³ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сохранСно ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. * Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π³Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ Π½Π° всС свойства Ρ„Π°ΠΉΠ»Π°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΈΠΏΡƒ File, Π½ΠΎ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ размСрности изобраТСния, Π²ΠΈΠ΄Π° `get[column][size][property]`. * Плюс ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ спСцифичныС для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. НапримСр для `column = "image", size = "thumb"` * `getImageThumbWidth($default = false)` - ΡˆΠΈΡ€ΠΈΠ½Π° изобраТСния * `getImageThumbHeight($default = false)` - ΡˆΠΈΡ€ΠΈΠ½Π° изобраТСния * `getImageThumbImg($alt = null, $attr = null, $default = false)` - гСнСрация Ρ‚Π΅Π³Π° `Img` с подставлСнными значСниями ΠΏΡƒΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты ## Π˜Π½Π΄Π΅ΠΊΡΡ‹ Π‘Ρ…Π΅ΠΌΠ° прСдусматриваСт созданиС индСксов ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ»ΠΈ нСскольким столбцам. ~~~ php $schema->addIndex($column, $_ = null) $schema->addUniqueIndex($column, $_ = null)

Бвязи ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ

Для создания внСшнСго ΠΊΠ»ΡŽΡ‡Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… InnoDB ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ:, (*27)

~~~ php $schema->addForeignKey($col, $schema, $foreign_id = null, $on_delete = null, $on_update = null), (*28)


Или ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· связСй, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ сгСнСрированы Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° связСй. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· сущностСй ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ связСй, Ρ‚Π°ΠΊ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, для ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ (Book) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π°Π²Ρ‚ΠΎΡ€ (Author), Π½ΠΎ ΠΏΡ€ΠΈ этом Ρƒ Π°Π²Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ½ΠΈΠ³. Π’.Π΅. связь `Book -> Author` ΠΎΠ΄ΠΈΠ½-ΠΊ-ΠΎΠ΄Π½ΠΎΠΌΡƒ, Π½ΠΎ `Author -> Book` ΡƒΠΆΠ΅ ΠΎΠ΄ΠΈΠ½-ΠΊ-ΠΌΠ½ΠΎΠ³ΠΈΠΌ. БоотвСтствСнно каТдая ΠΈΠ· связСй ΠΈ Π΅Ρ‘ Ρ‚ΠΈΠΏ указываСтся Π² своСй схСмС. **Π’Π°ΠΆΠ½ΠΎ!** ВсС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ связи Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ InnoDB. ### Один-ΠΊ-ΠΎΠ΄Π½ΠΎΠΌΡƒ

addOneToOne($schema, $col = null, $foreign_id = null, $on_delete = null, $on_update = null, $name = null, $one = null), (*29)


Π‘Π°ΠΌΡ‹ΠΉ простой Ρ‚ΠΈΠΏ связСй, ΠΊΠΎΠ³Π΄Π° ID внСшнСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° явно ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Бвязь добавляСт ΠΏΠΎΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ `$col` INT UNSIGNED DEFAULT NULL Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. **НапримСр:** ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Book содСрТит ΠΏΠΎΠ»Π΅ author_id, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ соотвСтствуСт ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Author. ~~~ php $schema->addOneToOne('Authors', 'author_id', 'id', Schema::FK_RESTRICT, Schema::FK_RESTRICT)

Если ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° имСнования столбцов ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ значСния ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° столбцов:, (*30)

~~~ php $schema->addOneToOne('Authors'), (*31)


Когда Π½Π° ΠΎΠ΄Π½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ сущСствуСт нСсколько связСй, ΠΈΠ»ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ сущностСй ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ схСмы, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ `$name` ΠΈ `$one` ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ для связи: ~~~ php $schema->addOneToOne('Authors', 'author_id', 'id', Schema::FK_RESTRICT, Schema::FK_RESTRICT, 'MyAuthors', 'MyAuthor')

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Book Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:, (*32)

~~~ php /** @return \Author */ public function getMyAuthor($reload = false), (*33)

/** @return static */ public function setMyAuthor(\Author $my_author), (*34)

/** @return \Author */ protected function findOneMyAuthor($id), (*35)


### Один-к-многим ~~~ php addOneToMany($schema, $foreign_id = null, $col = null, $name = null, $one = null)

Бвязь позволяСт Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… связь Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ. Π’ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π² Π‘Π” ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅ вносится., (*36)

НапримСр: ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Author ΠΈΠΌΠ΅Π΅Ρ‚ связь с нСсколькими Book, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° Π² ΠΏΠΎΠ»Π΅ author_id., (*37)

~~~ php $schema->addOneToMany('Books', 'book_id', 'id'), (*38)


Когда Π½Π° ΠΎΠ΄Π½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ сущСствуСт нСсколько связСй, ΠΈΠ»ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ сущностСй ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ схСмы, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ `$name` ΠΈ `$one` ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ для связи. ~~~ php $schema->addOneToMany('Books', null, null, 'MyBooks', 'MyBook')

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Author Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:, (*39)

~~~ php /** @return Collection|\Book[] */ public function getMyBooks($reload = false), (*40)

/** @return static */ public function setMyBooks($my_books_arr = null), (*41)

/** @return Collection|\Book[] */ protected function findMyBooks(), (*42)


### МногиС-к-многим ~~~ php addManyToMany($schema, $join_table = null, $foreign_col = null, $my_col = null, $foreign_id = null, $my_id = null, $name = null, $one = null)

Бвязь Π΄Π²ΡƒΡ… Ρ‚Π°Π±Π»ΠΈΡ† Ρ‡Π΅Ρ€Π΅Π· Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ., (*43)

НапримСр: Π£ ΠΊΠ½ΠΈΠ³ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² (Author), Ρƒ Π°Π²Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько ΠΊΠ½ΠΈΠ³ (Book). Для этого создаСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ AuthorBook, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡŽΡŽ поля book_id ΠΈ author_id, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ связь Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΊΠ½ΠΈΠ³ Ρ‡Π΅Ρ€Π΅Π· JOIN ΠΊ этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅., (*44)

~~~ php // Π‘Ρ…Π΅ΠΌΠ° AuthorBook $schema->addOneToOne('Authors') // author_id $schema->addOneToOne('Books') // book_id, (*45)

// Π’ схСмС Authors: addManyToMany('Books', 'author_book', 'book_id', 'author_id', 'id', 'id'), (*46)

// Π’ схСмС Books: addManyToMany('Authors', 'author_book', 'author_id', 'book_id', 'id', 'id'), (*47)


**ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Author Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:**

/** @return Collection|\Book[] */ public function getBooks($reload = false), (*48)

/** @return static */ public function addBook($book), (*49)

/** @return static */ public function removeBook($book), (*50)

/** @return static */ public function removeAllBooks(), (*51)

/** @param $book integer|\Book */ protected function getBookPK($book), (*52)

/** @return Collection|\Book[] */ protected function findBooks(), (*53)


## ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ На основС схСмы ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния Π‘Π” ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ для [ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ Phinx](https://phinx.org). Если Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² Π±Π°Π·Π΅ Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт, гСнСрируСтся миграция ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ всС столбцы\индСксы Π² Π½Π΅ΠΉ. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания Π½ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Books:** ~~~ php class NewBooksTable extends AbstractMigration { public function up() { $tbl = $this->table('test_books', array('id' => 'id')); $tbl->addColumn("name", "string", array ( 'length' => 255, 'null' => true,)); $tbl->addColumn("author_id", "integer", array ( 'length' => 11, 'signed' => true, 'null' => true,)); $tbl->addForeignKey("author_id", "test_authors", "id", array ( 'delete' => 'RESTRICT', 'update' => 'CASCADE',)); $tbl->save(); } public function down() { $tbl = $this->table('test_books', array('id' => 'id')); $tbl->drop(); } }

Если Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Π±Π°Π·Π΅ ΡƒΠΆΠ΅ сущСствуСт, Π² ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ гСнСрируСтся Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ столбцов, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² схСмС ΠΈ Π‘Π”, для столбцов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π½Π΅Π΅ Π±Ρ‹Π»ΠΈ созданы ΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Π‘Π” Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ changeColumn., (*54)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Pages:, (*55)

~~~ php class MyMigration extends AbstractMigration { public function up() { $tbl = $this->table('test_pages', array('id' => 'id')); $tbl->addColumn("is_active", "boolean", array ( 'default' => 0,)); $tbl->addColumn("price", "float", array ( 'precision' => 10, 'scale' => 2, 'signed' => false, 'default' => 0,)); $tbl->removeColumn("name"); $tbl->changeColumn("created_at", "timestamp", array ( 'default' => 'CURRENT_TIMESTAMP',)); if (!$tbl->hasForeignKey("parent_id")) { $tbl->addForeignKey("parent_id", "test_pages", "id", array ()); } $tbl->save(); }, (*56)

public function down() { $tbl = $this->table('test_pages', array('id' => 'id')); $tbl->removeColumn("is_active"); $tbl->removeColumn("price"); // TODO: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ инструкции для создания столбца name $tbl->save(); } } ~~~, (*57)

Π’Π°ΠΆΠ½ΠΎ! Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈ ΡΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ нСобходимости. НС Π½Π°ΠΊΠ°Ρ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ Π²ΡΠ»Π΅ΠΏΡƒΡŽ!, (*58)

The Versions