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, name

select_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 и это даст следующий результат.

Результат