fuelphp 模型和数据库
模型在 fuelphp web 框架中扮演着重要的角色。它代表应用程序的业务实体。它们要么由客户提供,要么从后端数据库获取,根据业务规则进行操作并持久化回数据库中。让我们在本章中了解模型以及它们如何与后端系统交互。
创建模型
在 fuelphp 中,模型只是简单的 php 类扩展内置模型类。默认情况下,模型可能以 model_ 为前缀,类似于控制器,应该放在 fuel/app/classes/model/ 文件夹中。让我们创建一个基本的员工模型,并在继续进行时对其进行扩展。
fuel/app/classes/model/employee.php
namespace model; class model_employee extends \model { public static function fetchall() { // code to fetch employee from database } }</pre--><h2>访问模型</h2>
一旦定义了模型,就可以在任何控制器中自由使用它,只需将其包含在控制器中,如下所示。
use \model\employee; class controller_employee extends controller { public function action_index() { $employees = employee::fetchall(); } }<h2>数据库概览</h2>
fuelphp 提供了自己的数据库抽象层来从数据库中获取数据。它提供了基本的和高级的基于 orm 的工具。基本工具包由基于 db、dbutil 和 query_builer 的类组成。高级工具包是 orm。 orm 工具包派生自基础工具包并捆绑为一个单独的包。
<h2>数据库配置</h2>
fuelphp 将数据库设置与主配置文件分开,该文件是 <strong>fuel/app/config/db.php</strong>。它支持为每个环境单独设置。目前,fuelphp 支持 mysql、mysqli 和 pdo 驱动程序。示例设置如下:
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, ), )<h2>基于数据库的工具包</h2>
<strong>db 类</strong> 是从应用程序访问数据库的最简单选项。它提供了构建数据库查询、针对目标数据库执行并最终获取结果的选项。 <em>db</em> 类与以下类交互并提供全面的数据库 api。
<ul> <li><strong>database_connection</strong>-与数据库交互的单例和主类</li> <li><strong>database_query</strong>-执行 sql 查询和获取结果的基础、具体类</li> <li><strong>database_query_builder</strong>-构建 sql 查询的基础抽象类</li> <li><strong>database_query_builder_join</strong>-构建 sql 连接的类</li> <li><strong>database_query_builder_where</strong>-构建 sql 查询条件的抽象类</li> <li><strong>database_query_builder_select</strong>-构建 sql 选择查询的具体类</li> <li><strong>database_query_builder_insert</strong>-构建 sql 插入查询的抽象类</li> <li><strong>database_query_builder_update</strong>-构建 sql 更新查询的抽象类</li> <li><strong>database_query_builder_delete</strong>-构建 sql 删除查询的抽象类</li> </ul>下图描述了类和类提供的方法之间的关系。
<img src="/public/core/edit/php/../attached/20231217205439_65489.jpg" alt="" border="0" />
<h2>数据库 api</h2>
让我们在本节中学习 db 类中可用的最重要的方法。
<h3>实例</h3> <ul> <li><strong>目的</strong>-创建并返回新的 <em>database_connection</em> 实例。</li> <li><strong>参数</strong>-</li> <li><strong>$db</strong>-配置文件中定义的数据库连接名称,可选。</li> <li><strong>返回</strong>-返回<em>database_connection</em> 对象</li> </ul>
例如
$db = db::instance(); $db = db::instance('test');<h3>查询</h3> <ul> <li><strong>目的</strong>-准备提供的 sql 语句并返回 database_query 对象,该对象可用于插入、更新、删除或从数据库中获取数据。</li> <li><strong>参数</strong>-</li> <li><strong>$query</strong>-sql 语句,可能包含占位符;</li> <li><strong>$type</strong>-sql 类型,可选(db::select、db::insert、db::update 和 db::delete)</li> <li><strong>返回</strong>-返回<em>database_query</em> 对象</li> </ul>
例如
$query = db::query('select * from 'employees'');<h3>last_query</h3> <ul> <li><strong>目的</strong>-获取最后执行的查询</li> <li><strong>参数</strong>-无</li> <li><strong>returns</strong>-返回最后执行的查询</li> </ul>
例如
$employees = db::select('select * from 'employee''); $sql = db::last_query();<h3>选择</h3> <ul> <li><strong>目的</strong>-生成查询的选择部分</li> <li><strong>参数</strong>-</li> <li><strong>$columns</strong>-数据库列名列表</li> <li><strong>返回</strong>-返回 database_query_builder_select 对象</li> </ul>
例如
$query = db::select(); // select * $query = db::select('id', 'name'); // select id, name<h3>select_array (db)</h3>
它与 select 类似,只是我们可以将列作为数组发送。
$query = db::select_array(array('id', 'name')); // select id, name<h3>插入</h3> <ul> <li><strong>目的</strong>-生成查询的插入部分</li> <li><strong>参数</strong>-</li> <li><strong>$table_name</strong>-数据库表的名称;</li> <li><strong>$columns</strong>-表列数组</li> <li><strong>返回</strong>-返回 database_query_builder_insert 对象</li> </ul>
例如
$query = db::insert('employee'); // insert into employee $query = db::insert('employee', array('id', 'name')); // insert into employee (id, name)<h3>更新</h3> <ul> <li><strong>目的</strong>-生成查询的更新部分</li> <li><strong>参数</strong>-</li> <li><strong>$table_name</strong>-数据库表名</li> <li><strong>返回</strong>-返回 database_query_builder_update 对象</li> </ul>
例如
$query = db::update('employee'); // update `employee`<h3>删除</h3> <ul> <li><strong>目的</strong>-生成查询的删除部分</li> <li><strong>参数</strong>-</li> <li><strong>$table_name</strong>-数据库表名</li> <li><strong>返回</strong>-返回 database_query_builder_delete 对象</li> </ul>
例如
$query = db::delete('employee'); // delete from 'employee'<h2>查询接口</h2>
<strong>database_query</strong> 提供了一个选项来设置数据库连接、执行查询并将结果作为关联数组或对象获取。让我们看看 database_query 类提供的方法。
<h3>set_connection</h3> <ul> <li><strong>目的</strong>-设置对其执行查询的数据库(数据库连接详细信息)</li> <li><strong>参数</strong>-$db-数据库连接名称</li> <li><strong>返回</strong>-返回<em>database_query</em> 对象</li> </ul>
例如
$query = db::query('delete * from employee', db::delete); $query->set_connection('2nd-db');<h3>参数</h3> <ul> <li><strong>目的</strong>-设置查询对象中定义的参数值</li> <li><strong>参数</strong>-</li> <li><strong>$param</strong>-参数名称;</li> <li><strong>$value</strong>-参数的值</li> <li><strong>返回</strong>-返回<em>database_query</em> 对象</li> </ul>
例如
// 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);<h3>类似方法</h3>
<strong>parameters</strong> 是一个类似的对象,只是它提供了一次给出多个值的选项。
$query->parameters (array( 'tablename' => $table, 'id' => $id, 'name' => $name });<h3>绑定</h3> <ul> <li><strong>目的</strong>-将变量设置为查询对象中定义的参数</li> <li><strong>参数</strong>-</li> <li><strong>$param</strong>-参数名称</li> <li><strong>$var</strong>-将参数绑定到的变量</li> <li><strong>返回</strong>-返回<em>database_query</em> 对象</li> </ul>
例如
// 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();<h3>编译</h3> <ul> <li><strong>目的</strong>-将定义的查询对象编译为 sql 查询</li> <li><strong>参数</strong>-</li> <li><strong>$db</strong>-连接字符串,可选</li> <li><strong>退货</strong>-</li> </ul>
例如
// 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();<h3>执行</h3> <ul> <li><strong>目的</strong>-执行查询对象中定义的查询并返回结果</li> <li><strong>参数</strong>-</li> <li><strong>$db</strong>-数据库连接名称</li> <li><strong>返回</strong>-返回结果</li> </ul>
例如
// 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();<h3>as_assoc</h3> <ul> <li><strong>目的</strong>-将返回类型设置为关联数组而不是对象</li> <li><strong>参数</strong>-无</li> <li><strong>返回</strong>-返回当前对象</li> </ul>
例如
$query = db::query('select * from employee', db::select); $result = $query->as_assoc()->execute(); foreach ($result as $row) { echo $row['id']; }<h3>as_object</h3> <ul> <li><strong>目的</strong>-将返回类型设置为对象而不是关联数组</li> <li><strong>参数</strong>-无</li> <li><strong>返回</strong>-返回当前对象</li> </ul>
例如
$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();<h2>查询生成器 api</h2>
查询构建器 <em>(query_builder)</em> 基于类提供动态构建 sql 查询的选项。它有四个类,每个类选择 <em>(query_builder_select)</em>、插入 <em>(query_builder_insert)</em>、更新 <em>(query_builder_update)</em>和删除 <em>(query_builder_delete )</em> 查询。这些类派生自 <em>query_builder_where</em> 类(生成条件的选项),该类本身派生自所有类的基础 <em>query_builder</em>。
让我们看看 query_builder 类提供的方法。
<h3>select</h3> <ul> <li><strong>目的</strong>-生成选择查询的列。</li> <li><strong>参数</strong>-</li> <li><strong>$columns</strong>-列列表,可选</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
例如
$query = db::select('name') // select `name` $query = db::select(array('first_name', 'name')) // select `first_name` as `name`<h3>from</h3> <ul> <li><strong>目的</strong>-生成选择查询的表详细信息</li> <li><strong>参数</strong>-</li> <li><strong>$tables</strong>-表格列表</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
例如
$query = db::select('name')->from('employee') // select `name` from `employee`<h3>where</h3> <ul> <li><strong>目的</strong>-生成选择、插入和更新查询的条件</li> <li><strong>参数</strong>-</li> <li><strong>$column</strong>-列名或数组 ($column, $alias);</li> <li><strong>$op</strong>-逻辑运算符,=、!=、in、between 和 like,可选;</li> <li><strong>$value</strong>-列值</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
例如
$query = db::select('name')->from('employee') $query = $query->where('name', '=', 'jon'); // select `name` from `employee` where `name` = `jon`;<h3>类似方法</h3>
类似的方法有 where_open(), and_where_open(), or_where_open(), where_close(), and_where_close(), or_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")<h3>join</h3> <ul> <li><strong>目的</strong>-生成选择查询的表连接</li> <li><strong>参数</strong>-</li> <li><strong>$table</strong>-表名或数组($table, $alias);</li> <li><strong>$type</strong>-连接类型(left、right、inner 等)</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
<strong>示例:</strong>
$query = db::select('name')->from('employee')->join('employee_salary') // select `name` from `employee` join `employee_salary`<h3>on</h3> <ul> <li><strong>目的</strong>-在选择查询中生成连接条件</li> <li><strong>参数</strong>-</li> <li><strong>$c1</strong>-表名或在数组中有别名的表名;</li> <li><strong>$op</strong>-逻辑运算符;</li> <li><strong>$c2</strong>-表名或在数组中有别名的表名</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
例如
$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`<h3>类似方法</h3>
相关方法有and_on()和or_on()。它们与 on() 类似,只是它们在连接周围添加了额外的关键字和括号。
<h3>group_by</h3> <ul> <li><strong>目的</strong>-按查询生成分组</li> <li><strong>参数</strong>-<strong>$columns</strong>-用于对结果进行分组的列名</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
例如
$query = db::select('name')->from('employee') $query = $query->group_by('name'); // select `name` from `employee` group by `name`<h3>having</h3> <ul> <li><strong>目的</strong>-根据 sql 查询条件生成分组</li> <li><strong>参数</strong>-<strong>$column</strong>-列名或数组( $column, $alias ); <strong>$op</strong>-逻辑运算符,=、!=、in、between 和 like,可选; <strong>$value</strong>-列值</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
<strong>示例:</strong>
$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`<h3>类似方法</h3>
类似的方法有having_open()、and_sharing_open()、or_sharing_open()、has_have_close()、and_sharing_close()、or_sharing_close()。除了它们在条件周围添加额外的关键字和括号之外,它们与 have() 方法类似。
<h3>reset</h3> <ul> <li><strong>目的</strong>-重置查询</li> <li><strong>参数</strong>-无</li> <li><strong>返回</strong>-返回当前实例</li> </ul>
例如
$query = db::select('name')->from('employee') $query->reset() $query = db::select('name')->from('employee_salary') // select `name` from `employee_salary`<h3>dbutil 类</h3>
dbutil 类提供管理和执行日常数据库操作的选项。一些重要的方法如下:
<ul> <li>set_connection-设置默认连接</li> </ul>dbutil::set_connection('new_database');<ul> <li>create_database-创建数据库。</li> </ul>dbutil::create_database('my_database');<ul> <li>drop_database-删除数据库。</li> </ul>dbutil::drop_database('my_database');<ul> <li>table_exists-检查给定的表是否存在。</li> </ul>if(dbutil::table_exists('my_table')) { // table exists } else { // table does not exist, create it! }<ul> <li>drop_table-删除一个表。</li> </ul>dbutil::drop_table('my_table');<ul> <li>create_table-创建一个表。</li> </ul>\dbutil::create_table ( 'users', array ( 'id' => array('type' => 'int', 'auto_increment' => true), 'name' => array('type' => 'text'), ), );<h2>orm 工具包</h2>
fuelphp 使用基于流行的 <strong>活动记录模式</strong>的 orm 概念提供高级数据库层。该工具包包含在应用程序中,但默认情况下未配置。它被捆绑成一个包,包名是orm。我们可以在主配置文件 <strong>fuel/app/config/config.php</strong>中添加如下配置来加载orm工具包。
'always_load' => array ( 'packages' => array ( 'orm', ), ),<h3>创建模型</h3>
orm 提供基础模型类 orm\model。我们需要使用 orm 模型扩展我们的模型以使用 orm 功能。以下是示例代码。
class model_employee extends orm\model {}<h3>configuration</h3>
orm 提供了一组设置来配置模型以使用 orm 功能。它们如下:
<strong>connection</strong>-在模型中设置静态 <em>_connection</em> 属性以指定连接名称。
class model_employee extends orm\model { protected static $_connection = "production"; }<strong>表名</strong>-在模型中设置静态 <em>_table_name</em> 属性以指定后端表的表名。
class model_employee extends orm\model { protected static $_table_name = 'employee'; }<strong>primary key</strong>-在模型中设置静态 <em>_primary_key</em> 属性以指定后端表的主键。
class model_employee extends orm\model { protected static $_primary_key = array('id'); }<strong>columns</strong>-在模型中设置静态 _properties 属性以指定后端表的列。支持数据类型、标签、验证、表单元素等
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' ), ), ); }<strong>条件</strong>-设置静态 <em>_conditions</em> 属性以设置条件和按选项排序。
class model_employee extends orm\model { protected static $_conditions = array ( 'order_by' => array('id' => 'desc'), 'where' => array ( array('is_active', > true), ), ); }<strong>observers</strong>- <em>orm</em> 提供基于观察者的事件系统来为特定事件添加行为。要添加行为,首先在模型中设置 <em>_observers</em> 属性。然后,将行为定义为一个类并将其与事件一起设置在 <em>_observers</em> 属性中。如果未指定事件,则将为所有事件调用该行为。我们也可以指定多种行为。
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 ) ); }<h3>create</h3>
一旦我们配置了模型,我们就可以立即开始使用这些方法。 <em>orm</em> 提供了一个 <em>save</em> 方法来将对象保存到数据库中。我们可以使用配置的属性设置数据如下:
// 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();<h3>read</h3>
orm 提供了一个方法,find 从数据库中获取数据并绑定到对象中。 find 方法的工作取决于输入参数。让我们看看不同的选项:
<strong>by primary key</strong>-指定主键通过匹配配置表的主键返回记录。
$employee = model_employee::find(1);<strong>first/last record</strong>-指定"first"或"last"将分别获取第一条记录或最后一条记录。我们也可以通过选项传递订单。
$entry = model_employee::find('first'); $entry = model_article::find('last', array('order_by' => 'id'));<strong>all</strong>-指定"all"将从配置的表中获取所有记录。我们可以按选项和条件指定顺序。
$entry = model_employee::find('all'); $entry = model_article::find ('all', array ( 'where' => array ( array ('name', 'jon'), ), 'order_by' => array ('id' => 'desc'), ));我们可以使用基本数据库工具包的查询 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();<h3>更新</h3>
更新模型与创建模型相同,只是不是创建新模型,而是使用 find 方法获取要更新的模型,更新属性,然后调用 save 方法,如下所示。
$entry = model_employee:find(4); $entry->name = 'peter'; $entry->save();<h3>删除</h3>
orm 提供了删除模型的删除方法。只需获取对象并调用删除方法即可。
$entry = model_employee:find(4); $entry->delete();<h2>工作示例</h2>
让我们在本章中创建一个工作示例来了解模型和数据库。
<h3>创建数据库</h3>
使用以下命令在 mysql 服务器中创建一个新数据库。
create database tutorialspoint_fueldb然后,使用以下命令在数据库中创建一个表。
create table employee(id int primary key, name varchar(20), age int not null);<h3>配置数据库</h3>
让我们使用数据库配置文件 *fuel/app/config/db.php 来配置数据库。添加以下更改以连接 mysql 服务器。
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, ), );<h3>包含 orm 包</h3>
更新主配置文件 <strong>fuel/app/config/config.php</strong> 通过添加以下配置来包含 orm 包。
'always_load' => array ( 'packages' => array ( 'orm' ), ),现在,您的应用程序中启用了 orm
<h3>创建员工模型</h3>
在模型文件夹 <strong>"fuel/app/classes/model"</strong>下新建一个模型employee,定义如下。
<strong>employee.php</strong>
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' ), ), ); }<h3>create action</h3>
在位于 <strong>fuel/app/classes/controller/employee.php</strong> 的 employee 控制器中创建新动作, <strong>action_model</strong>,如下所示。
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)); } }<h3>创建视图</h3>
现在,创建一个位于 <strong>"fuel/app/views/employee"</strong> 的视图文件 <strong>model.php</strong>。在文件中添加以下更改。
<ul> foreach($emps as $emp) { <li> echo $emp['name']; </li> } </ul>现在,请求 url, <strong>http://localhost:8080/employee/model</strong>,它将产生以下结果。
<h3>结果</h3>
<img src="/public/core/edit/php/../attached/20231217205331_95671.jpg" alt="" border="0" />
<h3><a href="/s7900103/fuelphp 表单编程.html">下一节:fuelphp 表单编程</a></h3> <a class="bottom-summary-prompt" href="/php/php_sz/153.html"><h3>fuelphp 教程</h3> </a>