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