Zend_Db_TableКласс таблицы - введениеКласс Zend_Db_Table является объектно-ориентированным интерфейсом к таблицам баз данных. Он предоставляет методы для многих общих операций над таблицами. Базовый класс является расширяемым, поэтому вы можете добавлять свою логику. Решением Zend_Db_Table является реализация паттерна » Table Data Gateway. Это решение также включает в себя класс, реализующий паттерн » Row Data Gateway. Определение класса таблицыДля каждой таблицы в БД, к которой нужен доступ, определяется класс, наследующий от Zend_Db_Table_Abstract. Определение имени и схемы таблицыУказывайте таблицу, для которой определен этот класс, используя защищенную переменную $_name. Переменная должна содержать имя таблицы в том виде, в котором она представлена в БД. Example #1 Объявление класса таблицы с явным определением имени таблицы
Если вы не определили имя таблицы, то по умолчанию оно равно имени класса. Если вы предпочитаете этот путь, то имя класса должно иметь то же написание, что и имя таблицы в БД. Example #2 Объявление класса таблицы с неявным определением имени таблицы
Вы можете также объявить схему таблицы в защищенной переменной $_schema или через добавленное перед именем таблицы имя схемы в свойстве $_name. Схема, указанная с помощью свойства $_name, имеет более высокий приоритет, чем схема, объявленная с помощью свойства $_schema. В некоторых СУРБД вместо термина "схема" используются термины "база данных" или "пространство таблиц", они используются аналогичным образом. Example #3 Объявление класса таблицы со схемой
Схема и таблица могут быть указаны через конфигурационные
директивы конструктора, которые замещают собой любые значения по
умолчанию, определенные с помощью свойств $_name и
$_schema. Спецификация схемы, данная через
директиву Example #4 Объявление имен таблицы и схемы во время инстанцирования
Если вы не указали имя схемы, то по умолчанию это будет схема, к которой подключен ваш экземпляр адаптера БД. Определение первичного ключа таблицыКаждая таблица должна иметь первичный ключ. Вы можете объявить столбец для первичного ключа, используя защищенную переменную $_primary. Это может быть строка с именем одного столбца или массив имен столбцов, если первичный ключ является составным. Example #5 Пример определения первичного ключа
Если вы не задали первичный ключ, то Zend_Db_Table_Abstract
пытается определить его, основываясь на данных, полученных
через метод
Переопределение методов установки таблицыКогда создается экземпляр класса таблицы, конструктор вызывает ряд защищенных методов, инициализирующих метаданные для таблицы. Вы можете переопределить любые из этих методов для того, чтобы явно определить эти метаданные. Помните, что в конце должен вызываться родительский метод. Example #6 Пример переопределения метода _setupTableName()
Методы установки могут быть переопределены следующим образом:
Инициализация таблицы
Если при создании объекта таблицы требуется выполнять код,
реализующий логику приложения, то вы можете поместить этот код в
метод Example #7 Пример использования метода init() Создание экземпляра класса таблицыДо того, как начать использование класса таблицы, создайте его экземпляр, используя конструктор. Единственным аргументом конструктора является массив опций. Наиболее важной опцией для конструктора является экземпляр адаптера БД, представляющий текущее соединение к какой-либо СУРБД. Есть три способа передачи адаптера БД классу таблицы, и эти три способа описаны ниже: Установка адаптера БД
Первым способом предоставления адаптера БД классу таблицы
является передача объекта типа Zend_Db_Adapter_Abstract в
массиве опций под ключом Example #8 Пример создания экземпляра таблицы с использованием объекта адаптера
Установка используемого по умолчанию адаптера БД
Вторым способом предоставления адаптера БД классу таблицы
является декларирование объекта типа Zend_Db_Adapter_Abstract
как используемого по умолчанию для всех экземпляров таблиц в
вашем приложении. Вы можете делать это через статический метод
Example #9 Пример создания экземпляра таблицы с адаптером, используемым по умолчанию
Может быть удобным создавать объект адаптера БД в центральной части вашего приложения - например, в загрузочном коде - и затем сохранять его как адаптер, используемый по умолчанию. Это дает возможность быть уверенным в том, что во всем приложении используется один и тот же экземпляр адаптера. Но установка адаптера, используемого по умолчанию, ограничена одним экземпляром адаптера. Хранение адаптера БД в реестре
Третий способ передачи адаптера БД классу таблицы -
передача строки в массиве опций под ключом Example #10 Пример создания экземпляра таблицы с использованием ключа реестра
Как и в случае установки адаптера, используемого по умолчанию, это дает возможность быть уверенным в том, что во всем приложении используется один и тот же адаптер, но использование реестра является более гибким, т.к. вы можете хранить в нем более одного экземпляра адаптера. Экземпляр адаптера является индивидуальным для конкретной СУРБД и экземпляра БД. Если в вашем приложении необходимо подключаться к нескольким БД или даже различным СУРБД, то вам нужно использовать несколько адаптеров. Добавление строк в таблицу
Вы можете использовать объект таблицы для добавления строк в таблицу
БД, на которой основан объект таблицы. Для этого используйте метод
Example #11 Пример добавления строк в таблицу
По умолчанию значения в вашем массиве данных добавляются как буквенные значения, с использованием параметров. Если вам нужно, чтобы они интерпретировались как выражения SQL, то необходимо обозначить их отличие от простых строк. Для этого используйте объекты типа Zend_Db_Expr. Example #12 Пример добавления выражений в таблицу
В примере добавления строки выше предполагается, что таблица имеет автоинкрементный первичный ключ. Это принятое по умолчанию поведение Zend_Db_Table_Abstract, но есть и другие типы первичных ключей. Следующий раздел описывает, как поддерживаются различные типы первичных ключей. Использование таблицы с автоинкрементным ключом
Автоинкрементный первичный ключ генерирует уникальное
целочисленное значение, если вы опустите столбец для
первичного ключа в своем операторе Если защищенная переменная в Zend_Db_Table_Abstract $_sequence имеет булево значение TRUE, то класс предполагает, что таблица имеет автоинкрементный столбец. Example #13 Пример объявления таблицы с автоинкрементным первичным ключом
Примерами СУРБД, поддерживающих автоинкрементные первичные ключи являются MySQL, Microsoft SQL Server и SQLite.
PostgreSQL имеет нотацию Использование таблицы с последовательностьюПоследовательность (sequence) является объектом базы данных, генерирующим уникальные значения, которые могут использоваться как значения уникальных ключей в одной и более таблицах БД.
Если вы присвоили $_sequence строковое значение,
то Zend_Db_Table_Abstract считает строку именем объекта
последовательности в БД. Последовательность запускается для
генерации нового значения, и это значение используется в
операции
Example #14 Пример объявления таблицы с последовательностью
Примерами СУРБД, поддерживающих объекты последовательностей являются Oracle, PostgreSQL и IBM DB2. PostgreSQL и IBM DB2 также имеют синтаксис, который неявно определяет последовательности и связывает их со столбцами. Если вы используете эту нотацию, то интерпретируйте таблицу как имеющую автоинкрементный ключевой столбец. Задавайте имя последовательности в виде строки только в тех случаях, когда вы собираетесь явно вызывать последовательности для получения следующего значения ключа. Использование таблицы с естественным ключомНекоторые таблицы имеют естественные ключи. Это означает, что ключ не генерируется автоматически таблицей или последовательностью. В этом случае вы должны установить значение первичного ключа.
Если вы присвоили $_sequence булево значение
FALSE, то Zend_Db_Table_Abstract считает, что
таблица имеет естественный первичный ключ. Вы должны
предоставлять значения для столбцов первичного ключа в массиве
данных для метода Example #15 Пример объявления таблицы с естественным ключом
Обновление строк в таблице
Вы можете обновлять строки в таблице БД, используя метод
Example #16 Пример обновления строк в таблице
Поскольку метод таблицы
Удаление строк из таблицы
Вы можете удалять строки из таблицы базы данных, используя метод
Example #17 Пример удаления строк из таблицы
Поскольку метод таблицы в свою очередь использует метод
Извлечение строк по первичному ключу
Вы можете запрашивать из таблицы БД строки, соответствующие
определенным значениям в первичном ключе, используя метод
Example #18 Пример извлечения строк по значениям первичного ключа
Если вы задали одно значение, то метод вернет максимум одну строку, потому что первичный ключ не может содержать повторяющиеся значения и должна быть максимум одна строка в таблице БД, соответствующая данному значению. Если вы задали несколько значений, то метод вернет максимум столько строк, сколько несовпадающих значений было задано.
Метод
Если первичный ключ является составным, т.e. он состоит из
нескольких столбцов, то можно задать добавочные столбцы как
дополнительные аргументы метода Для того чтобы найти несколько строк с составным первичным ключом, передавайте массив для каждого из аргументов. Все эти массивы должны иметь одно и то же количество элементов. Значения из всех массивов объединяются в "кортежи" в порядке следования; например, первые элементы каждого массива определяют значение первого составного первичного ключа, вторые элементы - второго составного ключа и т.д. Example #19 Пример извлечения строк по значениям составного первичного ключа
Вызов метода
Извлечение наборов строкAPI для произведения выборки
Warning
API для операций извлечения был изменен для того,
чтобы объект Следующие варианты являются корректными и функционально идентичными, но, тем не менее, рекомендуется обновить свой код с тем, чтобы получить преимущества нового подхода.
Объект Zend_Db_Table_Select является расширением объекта Zend_Db_Select, который накладывает некоторые специфические ограничения на запрос. Ниже перечислены дополнительные возможности и ограничения этого класса:
Example #20 Простое использование
В данной компоненте поддерживается fluent interface, поэтому пример выше может быть переписан в более краткой форме.
Example #21 Пример использования fluent interface
Извлечение набора строк
Вы можете извлекать наборы строк, используя любое другое
условие, отличное от значения первичного ключа, через метод
Example #22 Пример поиска строк по выражению
Вы можете также передавать условие для сортировки, которое
используется в предложении Example #23 Пример поиска строк по выражению
Все агрументы в примере выше являются опциональными. Если вы опустите предложение ORDER, то строки из таблицы будут возвращаться в непредсказуемом порядке. Если не было установлено предложение LIMIT, то вы получите все соответствующие предложению WHERE строки из таблицы. Расширенное использованиеДля более точных и оптимизированных запросов может потребоваться ограничить количество столбцов, возвращаемых в строке/наборе строк. Это может быть достигнуто путем передачи предложения FROM объекту выборки.
Example #24 Извлечение определенных столбцов
Important
Вы можете также указывать выражения в предложении FROM, но в
этом случае будуте получать строки/наборы строк,
доступные только для чтения. В этом примере мы будем возвращать
строки из таблицы Bugs, которые показывают количество
ошибок, сообщенное конкретным пользователем. Обратите
внимание на предложение GROUP. Столбец 'count' будет доступен в
объекте строки, и к нему можно обращаться так же, как если бы он
был частью схемы.
Полученный набор строк будет содержать строки, которые по-прежнему являются "рабочими", только они содержат не все столбцы таблицы. Если для неполной строки был вызван метод save(), то будут изменены только доступные в объекте столбцы.
Example #25 Извлечение выражений как столбцов
Example #26 Использование таблицы поиска для фильтрации результатов, возвращаемых fetchAll()
Класс Zend_Db_Table_Select главным образом используется для соблюдения и проверки корректности запроса. Тем не менее, могут быть определенные случаи, когда нужна большая гибкость компоненты Zend_Db_Table_Row и не требуется доступная для чтения или удаления строка. Для этого отдельного случая использования возможно получение строки/набора строк путем передачи значения false методу setIntegrityCheck(). В результате строка/набор строк будет возвращаться в "заблокированном" состоянии, это значит, что save(), delete() и методы для установки значений полей будут бросать исключения. Example #27 Отключение проверки целостности в Zend_Db_Table_Select для получения объединенных строк $table = new Bugs(); $select = $table->select()->setIntegrityCheck(false); $select->where('bug_status = ?', 'NEW') ->join('accounts', 'accounts.account_name = bugs.reported_by', 'account_name') ->where('accounts.account_name = ?', 'Bob'); $rows = $table->fetchAll($select); Извлечение одной строки
Вы можете запрашивать одну строку, используя условия, аналогичные
тем, что используются в методе Example #28 Пример поиска одной строки по выражению
Этот метод возвращает объект типа Zend_Db_Table_Row_Abstract. Если
по заданному вами условию поиска не найдено ни одной строки в
таблице БД, то Получение метаданных таблицы
Класс Zend_Db_Table_Abstract предоставляет некоторую информацию о
его метаданных. Метод Example #29 Пример получения имени таблицы
Ключи массива, возвращаемого методом
Кэширование метаданных таблицы
По умолчанию В некоторых условиях, особенно когда к одной и той же таблице БД создается много объектов таблиц, произведение запросов для получения метаданных для каждого экземпляря может быть нежелательным с точки зрения производительности. В таких случаях можно производить кэширование метаданных таблицы, полученных из БД. Есть два основных способа кэширования:
Zend_Cache_Core .
Эти методы могут использоваться вместе для того, чтобы
использовать по умолчанию определенный объект кэша и при этом иметь
возможность изменять его для конкретного объекта таблицы.
Example #30 Кэширование метаданных по умолчанию для всех объектов таблиц Следующий код показывает, как установить объект кэша, используемый по умолчанию во всех объектах таблиц:
Example #31 Кэширование метаданных для одного объекта таблицы Следующий код показывает, как устанавливается кэширование метаданных для одного конкретного объекта таблицы:
Несмотря на то, что в примерах выше используется
Расширение класса таблицыИспользование собственных классов строки и набора строкПо умолчанию методы класса таблицы возвращают наборы строк в экземплярах класса Zend_Db_Table_Rowset, и эти наборы строк содержат в себе коллекции экземпляров класса Zend_Db_Table_Row. Вы можете указать альтернативные классы, используемые вместо них, но в любом случае они должны наследовать от классов Zend_Db_Table_Rowset_Abstract и Zend_Db_Table_Row_Abstract соответственно.
Вы можете указать классы строки и набора строк в
массиве опций конструктора таблицы под ключами
Example #32 Пример указания классов строки и набора строк
Вы можете сменить используемые классы, указав их через методы
Example #33 Пример смены используемых для строк и наборов строк классов
Более подробную информацию о классах строки и набора строк ищите в Zend_Db_Table_Row и Zend_Db_Table_Rowset. Определение собственной логики для добавления, обновления и удаления строк
Вы можете переопределить методы Example #34 Собственная логика для управления отметками времени
Вы можете также переопределить метод Определение собственных методов для поиска
Вы можете реализовать собственные методы запросов в своем классе
таблицы, если приходится часто делать запросы к таблице с одними
и теми же условиями. Большинство запросов могут быть написаны с
использованием Example #35 Метод для поиска ошибок с определенным статусом
Определение инфлекции в Zend_Db_TableНекоторые разработчики предпочитают, чтобы имя класса таблицы сопоставлялось с именем таблицы в СУРБД с применением преобразования, называемого инфлекцией.
Например, если имя вашего класса таблицы -
" Вы можете указать имя таблицы БД независимо то имени класса, объявив его в свойстве $_name во всех классах этой таблицы. Zend_Db_Table_Abstract не производит инфлекцию при получении имени таблицы. Если вы опустите объявление свойства $_name в своем классе таблицы, то класс будет соответствовать таблице в БД с точно таким же именем, как и у него. Было бы неуместным использовать преобразование идентификаторов из БД, поскольку это может привести к неоднозначности или сделать некоторые идентификаторы недоступными. Использование SQL-идентификаторов в том виде, в котором они присутствуют в БД, делает Zend_Db_Table_Abstract проще и гибче в использовании.
Если вы предпочитаете использовать инфлекцию, то должны
реализовать преобразование сами, переопределив метод
Example #36 Пример абстрактного класса таблицы, реализующего инфлекцию Реализация функций для произведения инфлекционного преобразования возлагается на разработчика. Zend Framework не предоставляет для этих целей готовых функций.
|