FuelPHP - модели и база данных
Модель играет важную роль в веб-фреймворке FuelPHP. Он представляет бизнес-сущности приложения. Они либо предоставляются клиентами, либо извлекаются из серверной базы данных, обрабатываются в соответствии с бизнес-правилами и сохраняются обратно в базу данных. Давайте узнаем о моделях и о том, как они взаимодействуют с серверной системой в этой главе.
Создание модели
В FuelPHP модель - это простой PHP-класс, расширяющий встроенный класс Model. По умолчанию модели могут иметь префикс Model_, как и контроллеры, и должны быть помещены вfuel/app/classes/model/папка. Давайте создадим базовую модель сотрудников и расширим ее по мере продвижения.
топливо / приложение / классы / модель / employee.php
<?php 
   namespace Model; 
   class Model_Employee extends \Model { 
      public static function fetchAll() { 
         // Code to fetch employee from database 
      } 
   }Доступ к модели
После того, как модель определена, ее можно свободно использовать в любом контроллере, просто включив ее в контроллер следующим образом.
use \Model\Employee; 
class Controller_Employee extends Controller { 
   public function action_index() { 
      $employees = Employee::fetchAll(); 
   } 
}Обзор базы данных
FuelPHP предоставляет собственный уровень абстракции базы данных для извлечения данных из базы данных. Он предоставляет как базовый, так и расширенный инструмент на основе ORM. Базовый инструментарий состоит из классов на основе DB, DBUtil и Query_Builer. Расширенный инструментарий - Orm. Набор инструментов Orm является производным от базового набора инструментов и поставляется в виде отдельного пакета.
Конфигурация базы данных
FuelPHP отделяет настройки базы данных от основного файла конфигурации, и файл fuel/app/config/db.php. Он поддерживает отдельные настройки для каждой среды. В настоящее время FuelPHP поддерживает драйверы MySQL, MySQLi и PDO. Настройка образца выглядит следующим образом -
<?php  
   return array ( 
      'development' => array ( 
         'type'           => 'mysqli', 
         'connection'     => array ( 
            'hostname'    => 'localhost', 
            'port'        => '3306', 
            'database'    => 'tutorialspoint_fueldb', 
            'username'    => 'root', 
            'password'    => 'password', 
            'persistent'  => false, 
            'compress'    => false, 
         ), 
         
         'identifier'     => '`', 
         'table_prefix'   => '', 
         'charset'        => 'utf8', 
         'enable_cache'   => true, 
         'profiling'      => false, 
         'readonly'       => false, 
      ), 
   )Инструментарий на основе БД
В DB classэто самый простой вариант доступа к базе данных из приложения. Он предоставляет параметры для создания запроса к базе данных, выполнения его для целевой базы данных и, наконец, получения результата. Класс DB взаимодействует со следующими классами и предоставляет комплексный API базы данных.
- Database_Connection - Синглтон и основной класс для взаимодействия с базой данных 
- Database_Query - Базовый, конкретный класс для выполнения SQL-запроса и получения результата 
- Database_Query_Builder - Базовый абстрактный класс для построения SQL-запроса 
- Database_Query_Builder_Join - Класс для создания SQL-соединений 
- Database_Query_Builder_Where - Абстрактный класс для построения условий SQL-запроса 
- Database_Query_Builder_Select - Конкретный класс для построения запроса выбора SQL 
- Database_Query_Builder_Insert - Абстрактный класс для построения SQL-запросов на вставку 
- Database_Query_Builder_Update - Абстрактный класс для построения запроса на обновление SQL 
- Database_Query_Builder_Delete - Абстрактный класс для построения запроса на удаление SQL 
На следующей диаграмме показаны отношения между классами и методами, предоставляемыми классами.
 
                БД API
Давайте изучим самые важные методы, доступные в классе DB в этом разделе.
пример
- Purpose- Создает и возвращает новый экземпляр Database_Connection . 
- Parameter - - $db - Имя подключения к базе данных, определенное в файле конфигурации, необязательно. 
 
- Returns- Возвращает объект Database_Connection 
Например,
$db = DB::instance(); 
$db = DB::instance('test');запрос
- Purpose - Подготовить предоставленный оператор SQL и вернуть объект Database_Query, который можно использовать для вставки, обновления, удаления или выборки данных из базы данных. 
- Parameter - - $query - оператор SQL, может содержать заполнители; 
- $type - Тип SQL, необязательный (DB :: SELECT, DB :: INSERT, DB :: UPDATE и DB :: DELETE) 
 
- Returns- Возвращает объект Database_Query 
Например,
$query = DB::query('SELECT * FROM 'employees'');last_query
- Purpose - Получить последний выполненный запрос 
- Parameter - нет 
- Returns - Возвращает последний выполненный запрос 
Например,
$employees = DB::Select('Select * from 'employee''); 
$sql = DB::last_query();Выбрать
- Purpose - Сгенерировать выбранную часть запроса 
- Parameter - - $columns - Список имен столбцов базы данных 
 
- Returns - Возвращает объект Database_Query_Builder_Select 
Например,
$query = DB::select();              // Select *
$query = DB::select('id', 'name'); // Select id, nameselect_array (БД)
Это похоже на выбор, за исключением того, что мы можем отправлять столбцы в виде массива.
$query = DB::select_array(array('id', 'name')); // Select id, nameвставить
- Purpose - Сгенерировать вставляемую часть запроса 
- Parameter - - $table_name - имя таблицы базы данных; 
- $columns - массив столбцов таблицы 
 
- Returns - Возвращает объект Database_Query_Builder_Insert 
Например,
$query = DB::insert('employee');  // Insert into employee 
$query = DB::insert('employee', array('id', 'name')); // Insert into employee (id, name)Обновить
- Purpose - Сгенерировать обновленную часть запроса 
- Parameter - - $table_name - имя таблицы базы данных 
 
- Returns - Возвращает объект Database_Query_Builder_Update 
Например,
$query = DB::update('employee'); // update `employee`удалять
- Purpose - Сгенерировать удаляемую часть запроса 
- Parameter - - $table_name - имя таблицы базы данных 
 
- Returns - Возвращает объект Database_Query_Builder_Delete 
Например
$query = DB::delete('employee');  // delete from 'employee'API запросов
Database_Queryпредоставляет возможность установить соединение с базой данных, выполнить запрос и получить результат в виде ассоциативного массива или объекта. Давайте посмотрим на методы, предоставляемые классом Database_Query.
set_connection
- Purpose - Чтобы установить базу данных (детали соединения с базой данных), по которой будет выполняться запрос 
- Parameter - $ db - имя подключения к базе данных 
- Returns- Возвращает объект Database_Query 
Например,
$query = DB::query('DELETE * FROM employee', DB::DELETE); 
$query->set_connection('2nd-db');парам
- Purpose - Для установки значения параметра, определенного в объекте запроса 
- Parameter - - $param - название параметра; 
- $value - значение параметра 
 
- Returns- Возвращает объект Database_Query 
Например,
// set some variables
$table = 'employee';
$id = 1;
$name = 'Jon';
// don't use
$query = DB::query('SELECT * FROM '.$table.'. WHERE id = '.$id.' AND name = "'.$name.'"');
// but use
$query = DB::query('SELECT * FROM :tablename WHERE id = :id AND name = :name');
$query->param('tablename', 'employee');
$query->param('id', $id);
$query->param('name', $name);Подобные методы
parameters похож на объект, за исключением того, что он дает возможность указать несколько значений одновременно.
$query->parameters (array( 
   'tablename' => $table, 
   'id' => $id, 
   'name' => $name 
});связывать
- Purpose - Чтобы установить переменную для параметра, определенного в объекте запроса 
- Parameter - - $param - имя параметра 
- $var - переменная для привязки параметра к 
 
- Returns- Возвращает объект Database_Query 
Например,
// bind a query parameter 
$table = 'employee'; 
$query = DB::query('DELETE * FROM :tablename', DB::DELETE); 
$query->bind('tablename', $table);  
// update the variable 
$table = 'employee_salary'; 
// DELETE * FROM `employee_salary`; 
$sql = $query->compile();компилировать
- Purpose - Чтобы скомпилировать объект запроса, определенный в SQL-запрос 
- Parameter - - $db - строка подключения, необязательно 
 
- Returns - 
Например,
// assign a value to a query parameter 
$table = 'employee'; 
$query = DB::query('DELETE * FROM :tablename', DB::DELETE); 
$query->param('tablename', $table);
// compile the query, returns: DELETE * FROM employee 
$sql = $query->compile();выполнять
- Purpose - Выполнить запрос, определенный в объекте Query, и вернуть результат 
- Parameter - - $db - имя подключения к базе данных 
 
- Returns - Возвращает результат 
Например,
// assign a value to a query parameter 
$table = 'employee'; 
$query = DB::query('DELETE * FROM :tablename', DB::DELETE); 
$query->param('tablename', $table);  
// execute the query 
$query->execute();as_assoc
- Purpose - Установить возвращаемый тип как ассоциативный массив вместо объектов 
- Parameter - нет 
- Returns - Возвращает текущий объект 
Например,
$query = DB::query('SELECT * FROM employee', DB::SELECT); 
$result = $query->as_assoc()->execute(); 
foreach ($result as $row) { 
   echo $row['id']; 
}as_object
- Purpose - Установить возвращаемый тип как объект вместо ассоциативного массива 
- Parameter - нет 
- Returns - Возвращает текущий объект 
Например,
$query = DB::query('SELECT * FROM employee', DB::SELECT); 
$result = $query->as_object()->execute(); 
foreach ($result as $row) { 
   echo $row->id; 
}  
// have ORM model objects return instead 
$result = $query->as_object('Model_Employee')->execute();API построителя запросов
Query Builder (Query_Builder) на основе классов предоставляют возможности для запросов SQL сборки динамически. Он имеет четыре класса, каждый для выбора (Query_Builder_Select) , вставки (Query_Builder_Insert) , обновления (Query_Builder_Update) и удаления (Query_Builder_Delete) запросов. Эти классы являются производными от класса Query_Builder_Where (опция для создания условий), который сам является производным от Query_Builder , базы всех классов.
Давайте посмотрим на методы, предоставляемые классом Query_Builder.
Выбрать
- Purpose - Для создания столбцов избранных запросов. 
- Parameter - - $columns - список столбцов, необязательно 
 
- Returns - Возвращает текущий экземпляр 
Например,
$query = DB::select('name')  // select `name` 
$query = DB::select(array('first_name', 'name')) // select `first_name` as `name`из
- Purpose - Для генерации таблицы деталей выбранных запросов 
- Parameter - - $tables - список таблиц 
 
- Returns - Возвращает текущий экземпляр 
Например,
$query = DB::select('name')->from('employee') // select `name` from `employee`где
- Purpose - Для создания условий выбора, вставки и обновления запросов 
- Parameters - - $column - имя столбца или массив ($ column, $ alias); 
- $op - логические операторы, =,! =, IN, BETWEEN и LIKE, необязательно; 
- $value - значение столбца 
 
- Returns - Возвращает текущий экземпляр 
Например,
$query = DB::select('name')->from('employee')  
$query = $query->where('name', '=', 'Jon'); 
// select `name` from `employee` where `name` = `Jon`;Подобные методы
Аналогичные методы - where_open (), and_where_open (), or_where_open (), where_close (), and_where_close () или_where_close (). Они похожи на методы where () за исключением того, что в них добавляются дополнительные ключевые слова и скобки вокруг условий. Ниже приведен пример кода.
$query = DB::select('*')->from('employee');  
$query->where('email', 'like', '%@gmail.com'); 
$query->or_where_open(); 
$query->where('name', 'Jon'); 
$query->and_where('surname', 'Peter');
$query->or_where_close();  
// SELECT * FROM `employee` WHERE `email` LIKE "%gmail.com" OR 
   (`name` = "Jon" AND `surname` = "Peter")присоединиться
- Purpose - Для генерации объединения таблиц выбранных запросов 
- Parameters - - $table - имя таблицы или массив ($ table, $ alias); 
- $type - тип соединения (LEFT, RIGHT, INNER и т. Д.) 
 
- Returns - Возвращает текущий экземпляр 
пример
$query = DB::select('name')->from('employee')->join('employee_salary') 
// select `name` from `employee` JOIN `employee_salary`на
- Purpose - Сгенерировать условие объединения в выбранных запросах 
- Parameters - - $c1 - имя таблицы или имя таблицы с псевдонимом в массиве; 
- $op - логический оператор; 
- $c2 - имя таблицы или имя таблицы с псевдонимом в массиве 
 
- Returns - Возвращает текущий экземпляр 
Например,
$query = DB::select('name')->from('employee')->join('employee_salary') 
$query = $query->on('employee.employee_id', '=', 'employee_salary.employee_id') 
// select `name` from `employee` JOIN `employee_salary` on 
// `employee.employee_id` = `employee_salary.employee_id`Подобные методы
Связанные методы - and_on () и or_on (). Они похожи на on () за исключением того, что они добавляют дополнительное ключевое слово и скобки вокруг объединений.
группа по
- Purpose - Сгенерировать группу по запросам 
- Parameter - $columns - Имя столбца, по которому группировать результат 
- Returns - Возвращает текущий экземпляр 
Например,
$query = DB::select('name')->from('employee')  
$query = $query->group_by('name'); 
// select `name` from `employee` group by `name`имея
- Purpose - Формировать группу по условиям SQL запросов 
- Parameter - $column - имя столбца или массив ($ column, $ alias); $op - логические операторы, =,! =, IN, BETWEEN и LIKE, необязательно; $value - значение столбца 
- Returns - Возвращает текущий экземпляр 
пример
$query = DB::select('name')->from('employee')
$query = $query->group_by('name');
$query = $query->having('name', '!=', 'Jon');
// select `name` from `employee` group by `name` having `name` != `Jon`Подобные методы
Аналогичные методы имеют has_open (), and_having_open (), or_having_open (), Have_close (), and_having_close () или_having_close (). Они похожи на методы Have (), за исключением того, что они добавляют дополнительные ключевые слова и скобки вокруг условий.
сброс
- Purpose - Сбросить запрос 
- Parameter - нет 
- Returns - Возвращает текущий экземпляр 
Например,
$query = DB::select('name')->from('employee')  
$query->reset() 
$query = DB::select('name')->from('employee_salary') 
// select `name` from `employee_salary`DBUtil класс
Класс DBUtil предоставляет возможность управлять и выполнять рутинные операции с базой данных. Вот некоторые из важных методов:
- set_connection - устанавливает соединение по умолчанию
DBUtil::set_connection('new_database');- create_database - создает базу данных.
DBUtil::create_database('my_database');- drop_database - Удаляет базу данных.
DBUtil::drop_database('my_database');- table_exists - Проверяет, существует ли данная таблица.
if(DBUtil::table_exists('my_table')) { 
   // Table exists 
} else { 
   // Table does NOT exist, create it! 
}- drop_table - отбрасывает таблицу.
DBUtil::drop_table('my_table');- create_table - создает таблицу.
\DBUtil::create_table ( 
   'users', 
   array ( 
      'id' => array('type' => 'int', 'auto_increment' => true), 
      'name' => array('type' => 'text'), 
   ), 
);Набор инструментов Orm
FuelPHP предоставляет расширенный уровень базы данных с использованием концепции ORM, основанной на популярных Active record pattern. Набор инструментов включен в приложение, но не настроен по умолчанию. Он поставляется в виде пакета, и его имя - orm. Мы можем добавить следующую конфигурацию в основной файл конфигурации,fuel/app/config/config.php для загрузки набора инструментов orm.
'always_load' => array ( 
   'packages' => array (
      'orm', 
   ), 
),Создание моделей
Orm предоставляет класс базовой модели Orm \ Model. Нам нужно расширить наши модели с помощью модели orm, чтобы использовать функции ORM. Ниже приведен пример кода.
class Model_Employee extends Orm\Model {}Конфигурация
Orm предоставляет набор настроек для настройки модели для использования функций ORM. Они следующие -
connection- Установите статическое свойство _connection в модели, чтобы указать имя соединения.
class Model_Employee extends Orm\Model { 
   protected static $_connection = "production"; 
}table name- Установите статическое свойство _table_name в модели, чтобы указать имя таблицы серверной части.
class Model_Employee extends Orm\Model { 
   protected static $_table_name = 'employee'; 
}primary key- Установите статическое свойство _primary_key в модели, чтобы указать первичный ключ серверной таблицы.
class Model_Employee extends Orm\Model { 
   protected static $_primary_key = array('id'); 
}Columns- Задайте статическое свойство _properties в модели, чтобы указать столбцы серверной таблицы. Он поддерживает data_type, label, validation, form elements и т. Д.
class Model_Employee extends Orm\Model { 
   protected static $_properties = array ( 
      'id',  
      'name' => array ( 
         'data_type' => 'varchar', 
         'label' => 'Employee Name', 
         'validation' => array ( 
            'required',  
            'min_length' => array(3),  
            'max_length' > array(80) 
         ), 
         
         'form' => array ( 
            'type' => 'text' 
         ), 
      ),  
      'age' => array ( 
         'data_type' => 'int', 
         'label' => 'Employee Age', 
         'validation' => array ( 
            'required',  
         ),  
         
         'form' => array ( 
            'type' => 'text' 
         ), 
      ),  
   ); 
}Conditions- Установите статическое свойство _conditions, чтобы установить условия и упорядочить их по параметрам.
class Model_Employee extends Orm\Model { 
   protected static $_conditions = array ( 
      'order_by' => array('id' => 'desc'), 
      'where' => array ( 
         array('is_active', > true), 
      ), 
   ); 
}Observers- Orm предоставляет систему событий на основе наблюдателя для добавления поведения к определенным событиям. Чтобы добавить поведение, сначала установите свойство _observers в модели. Затем определите поведение как класс и установите его в свойстве _observers вместе с событиями. Если событие не указано, поведение будет вызываться для всех событий. Мы также можем указать несколько вариантов поведения.
class Model_Employee { 
   protected static $_observers = array ( 
      'example',  // will call Observer_Example class for all events 
      'Orm\\Observer_CreatedOn' => array ( 
         'events' => array('before_insert'),  
         // will only call Orm\Observer_CreatedOn at before_insert event 
      ) 
   ); 
}Создайте
После настройки модели мы можем сразу приступить к использованию методов. Orm предоставляет метод save для сохранения объекта в базе данных. Мы можем установить данные, используя настроенные свойства следующим образом:
// option 1 
$new = new Model_Employee(); 
$new->name = 'Jon'; 
$new->save();  
// option 2, use forge instead of new 
$new = Model_Employee::forge();
$new->name = 'Jon'; 
$new->save();  
// option 3, use array for properties 
$props = array('name' => 'Jon'); 
$new = Model_Employee::forge($props); 
$new>save();Читать
Orm предоставляет метод find для получения данных из базы данных и привязки к объекту. Метод find работает в зависимости от входного параметра. Давайте посмотрим на разные варианты -
by primary key - Указание первичного ключа возвращает запись, совпадающую с первичным ключом настроенной таблицы.
$employee = Model_Employee::find(1);first / last record- Указание «первая» или «последняя» приведет к выборке первой или последней записи соответственно. Мы также можем передать заказ по опциону.
$entry = Model_Employee::find('first'); 
$entry = Model_Article::find('last', array('order_by' => 'id'));All- Если указать «все», будут извлечены все записи из настроенной таблицы. Мы можем указать заказ как по опциям, так и по условиям.
$entry = Model_Employee::find('all');  
$entry = Model_Article::find ('all', array ( 
   'where' => array ( 
      array ('name', 'Jon'), 
   ), 
   'order_by' => array ('id' => 'desc'), 
));Мы можем использовать Query API базового инструментария базы данных вместе с моделью для расширенного поиска следующим образом.
$query = Model_Employee::query()->where('category_id', 1)->order_by('date', 'desc');
$number_of_employees = $query->count(); 
$latest_employee = $query->max('id'); 
$young_employee = $query->min('age'); 
$newest_employee = $query->get_one(); 
$employees = $query->limit(15)->get();Обновить
Обновление модели аналогично созданию, за исключением того, что вместо создания новой модели просто выберите модель для обновления с помощью метода поиска, обновите свойство и затем вызовите метод сохранения, как показано ниже.
$entry = Model_Employee:find(4);
$entry->name = 'Peter'; 
$entry->save();удалять
Orm предоставляет метод удаления для удаления модели. Просто выберите объект и вызовите метод удаления.
$entry = Model_Employee:find(4); 
$entry->delete();Рабочий пример
Давайте создадим рабочий пример в этой главе, чтобы понять модель и базу данных.
Создать базу данных
Создайте новую базу данных на сервере MySQL, используя следующую команду.
create database tutorialspoint_fueldbЗатем создайте таблицу в базе данных, используя следующую команду.
create table employee(id int primary key, name varchar(20), age int not null);Настроить базу данных
Давайте настроим базу данных, используя файл конфигурации базы данных, * fuel / app / config / db.php. Добавьте следующие изменения для подключения к серверу MySQL.
<?php  
   return array ( 
      'development' => array ( 
         'type'           => 'mysqli', 
         'connection'     => array ( 
            'hostname'       => 'localhost', 
            'port'           => '3306', 
            'database'       => 'tutorialspoint_fueldb', 
            'username'       => 'root', 
            'password'       => 'pass', 
            'persistent'     => false, 
            'compress'       => false, 
         ), 
         
         'identifier'     => '`', 
         'table_prefix'   => '', 
         'charset'        => 'utf8', 
         'enable_cache'   => true, 
         'profiling'      => false, 
         'readonly'       => false, 
      ),  
      
      'production' => array ( 
         'type'           => 'mysqli', 
         'connection'     => array ( 
            'hostname'       => 'localhost', 
            'port'           => '3306', 
            'database'       => 'tutorialspoint_fueldb', 
            'username'       => 'root', 
            'password'       => 'pass', 
            'persistent'     => false, 
            'compress'       => false, 
         ), 
         
         'identifier'     => '`', 
         'table_prefix'   => '', 
         'charset'        => 'utf8', 
         'enable_cache'   => true, 
         'profiling'      => false, 
         'readonly'       => false, 
      ), 
   );Включить пакет ORM
Обновите основной файл конфигурации, fuel/app/config/config.php чтобы включить пакет ORM, добавив следующую конфигурацию.
'always_load' => array ( 
   'packages' => array ( 
      'orm' 
   ), 
),Теперь в вашем приложении включен ORM
Создать модель сотрудника
Создайте новую модель "Сотрудник" в папке модели. “fuel/app/classes/model”. Это определяется следующим образом.
Employee.php
<?php  
   class Model_Employee extends Orm\Model { 
      protected static $_connection = 'production'; 
      protected static $_table_name = 'employee'; 
      protected static $_primary_key = array('id'); 
      protected static $_properties = array ( 
         'id',  
         'name' => array ( 
            'data_type' => 'varchar', 
            'label' => 'Employee Name', 
            'form' => array (
               'type' => 'text' 
            ), 
         ),  
         
         'age' => array ( 
            'data_type' => 'int', 
            'label' => 'Employee Age', 
            'form' => array ( 
               'type' => 'text' 
            ), 
         ),  
      ); 
   }Создать действие
Создать новое действие, action_model в контролере сотрудников, расположенном по адресу fuel/app/classes/controller/employee.php следующим образом.
class Controller_Employee extends Controller { 
   public function action_model() { 
      
      // db based sql command to delete all employees 
      $query = db::query('delete from `employee`'); 
      $query->execute('production');  
      
      // orm based query to add new employees 
      $model = new model_employee(); 
      $model->name = "john"; 
      $model->age = 25; 
      $model->save();  
      $model = new model_employee(); 
      $model->name = "peter"; 
      $model->age = 20; 
      $model->save(); 
      
      // orm based query to fetch all employee data 
      $data = array(); 
      $data['emps'] = model_employee::find('all');  
      return response::forge(view::forge('employee/model', $data)); 
   } 
}Создать представление
Теперь создайте файл просмотра model.php расположен в “fuel/app/views/employee”. Добавьте в файл следующие изменения.
<ul> 
   <?php 
      foreach($emps as $emp) {  
   ?> 
   <li><?php echo $emp['name']; ?></li> 
   
   <?php 
   } 
   ?> 
</ul>Теперь запросите URL-адрес, http://localhost:8080/employee/model и это даст следующий результат.
Результат
