tp5使用模型示例

注意模型返回的是对象,可以使用 ->toArray(); 来转换成数组

DB操作返回是数组。

模型直接操作返回是对象。

当我们用 select()进行查询得出的结果 无法toarray的时候,下面的方法就用得上了。

对象类型转换数组

打开 database.php 增加或修改参数
‘resultset_type’ => ‘\think\Collection’,

即可连贯操作
model(‘user’)->select()->toArray()

控制器中

<?php
namespace app\home\controller;

// 模型重命名
use app\home\model\Login as LoginModel;    
use think\Controller;
use think\Session;
use think\Db;
use think\Request;

class login extends controller
{
	public function regpage()
	{
		return $this->fetch('reg');
	}


	// 在这使用模型
	public function reg()
	{
		echo '<pre>';
		$data = $_POST;
		
		// 使用模型
		$login = new LoginModel();
		$result = $login->reg($data);
		
		if($result)
		{
			// die;
			$this->success('注册成功','home/login/index');		// 注册成功,跳到登录页

		}
	 }

}
?>

模型中

<?php
namespace app\home\model;

use think\Model;
use think\Session;
use think\Db;
use think\Request;

class Login extends Model
{
	protected $pk = 'id';
	protected $table = 'tp5_user';
	
	// 增删改查方法
	
	public function insert($data)
	{
        // return $this ->add($data);     // 不能用 add 要用 save
        return $this ->save($data);  
	}

	public function update_my($where,$data)
	{
		$result = $this->where($where)->update($data);   // 或者直接return
		return $result;
        // return $this->where( $where )->save($data);

	}

	public function delete_my($where)
	{
		$result = $this->where($where)->delete();
		return $result;
	}


	public function find($where)
	{
		return $this->where($where)->find();
	}

	public function findall($where)
	{
		// return $this->select();
		return $this->where( $where )->select();
	}

	public function reg($data)
	{
		echo '<pre>';
		// var_dump($data);
		// die;
		$data2 = [
					'username' =>$data['username'],
					'userpass' =>md5($data['password'])
				];

		$where['username'] = $data['username'];
		if($a = $this->find($where))		// 判断用户名是否已注册
		{   

			$this->success('用户名已被注册');   					
		}else if(empty($data['password']))		
		{
	
			$this->success('密码不能为空');
		}else{
		
			$result = $this->insert($data2);
			return $result;
		}	

}


}

?>

控制器中 实验 模型的 增删改查 方法

public function reg()
{
	echo '<pre>';
	$data = $_POST;

	$login = new LoginModel();

	// 试试查询
	// $where['username'] = 'admin';
	// $result = $login->find($where)->toArray();

	// 试试修改
	// $where['id'] = '1';
	// $data222['username'] = 'xiugai';
	
	// $result = $login->update_my($where,$data222);
	
	// 试试删除
	$where['id'] = '1';
	$result = $login->delete_my($where);
	
	
	var_dump($result);
	die;
}
<think>我们在ThinkPHP5框架中使用模型时,有时需要调用数据库函数(如COUNT,SUM,MAX等)来进行聚合查询或执行一些数据库函数操作。模型提供了多种方法来实现这些功能,包括使用聚合方法、使用field方法结合表达式等。###1.使用聚合方法ThinkPHP5模型内置了常用的聚合方法,如: -`count()`:统计数量-`max()`:获取最大值-`min()`:获取最小值- `avg()`:获取平均值-`sum()`:求和例如,统计用户数量: ```php$count= User::count(); ```或者按条件统计: ```php$count= User::where('status',1)->count();``` ###2.使用`field`方法结合表达式当需要查询的字段需要用到数据库函数(如`CONCAT`, `DATE_FORMAT`等)时,可以使用`field`方法结合表达式。例如,查询用户的名字和拼接的字符串: ```php$users= User::field('id, CONCAT(first_name," ",last_name) asfull_name')->select(); ```或者使用模型提供的`exp`方法(在连贯操作中):```php$users =User::field(['id','exp' =>"CONCAT(first_name,' ',last_name) asfull_name"])->select();``` 注意:在ThinkPHP5.1之后,可以直接在field方法中使用字符串表达式。 ###3.使用`fetchSql`方法查看生成的SQL如果不确定生成的SQL是否正确,可以使用`fetchSql`方法:```php$sql =User::field('id,CONCAT(first_name, "", last_name)as full_name')->fetchSql(true)->select();echo $sql;``` ###4.使用查询构造器的方法模型本身继承自查询构造器,所以可以使用查询构造器的所有方法。例如,使用`group`和`having`:```php$result= User::field('department, AVG(salary)as avg_salary')->group('department')->having('avg_salary>5000')->select(); ```###5.使用`Db::raw`执行原始表达式在需要防止数据被转义的情况下,可以使用`Db::raw`,例如:```phpusethink\Db;$users= User::field('id, '. Db::raw('CONCAT(first_name," ",last_name) asfull_name'))->select();``` 或者(更简洁的方式): ```php$users= User::field('id, CONCAT(first_name," ",last_name) asfull_name')->select(); ```在ThinkPHP5.1中,默认情况下,field方法中的表达式不会被自动转义,因此可以直接写。 ###注意事项-在调用数据库函数时,注意字段名可能需要用反引号(`)括起来,特别是字段名与数据库关键字冲突时。-使用聚合函数时,如果查询结果是一个值(如count, max等),则直接返回该值;如果是多个字段(如groupby查询),则返回数组或模型对象集合。 ###示例:在模型中调用数据库函数假设我们有一个订单模型(Order),我们想计算每个用户的订单总金额(使用SUM函数): ```php$orders =Order::field('user_id, SUM(amount)as total_amount')->group('user_id')->select(); ```或者,在模型中定义一个方法来完成这个查询: ```phpnamespace app\model; usethink\Model; classOrder extendsModel{public functiongetTotalAmountByUser(){return$this->field('user_id,SUM(amount)as total_amount')->group('user_id')->select();} }``` ###总结在ThinkPHP5模型中调用数据库函数,主要可以通过:1.使用内置的聚合方法(如count,sum等)进行简单的聚合查询。2.使用`field`方法结合表达式(包括数据库函数)来查询字段。 3.使用`Db::raw`来防止表达式被转义(在需要时)。 4.使用查询构造器的其他方法(如group,having)来构建复杂查询。通过以上方法,可以灵活地在模型使用数据库函数进行各种操作[^1][^2]。 §§相关问题§§1.在ThinkPHP5中,如何使用模型进行分组查询并统计每组的数量? 2. ThinkPHP5模型中的聚合方法有哪些?请举例说明。 3.如何在ThinkPHP5模型使用原生SQL表达式而不被转义? 4.在ThinkPHP5中,如何通过模型执行复杂的JOIN查询并调用数据库函数?</think>在 ThinkPHP5 框架中,模型(Model)调用数据库函数主要有以下几种方法: ### 📌 一、使用模型内置的聚合方法(推荐) ThinkPHP5 模型内置了常用数据库函数的快捷方法: ```php // 统计数量 $count = User::count(); // 计算字段总和 $total = Order::where('status', 1)->sum('price'); // 获取最大值 $maxScore = Student::max('score'); // 获取最小值 $minAge = Employee::min('age'); // 计算平均值 $avgSalary = Salary::avg('amount'); ``` ### 📌 二、使用 `field()` 方法结合表达式 在查询构造器中直接调用数据库函数: ```php // 示例使用 CONCAT 函数拼接字段 $users = User::field('id, CONCAT(first_name," ",last_name) AS full_name') ->select(); // 示例使用 DATE_FORMAT 格式化时间 $orders = Order::field('id, DATE_FORMAT(create_time,"%Y-%m") AS create_month') ->select(); ``` ### 📌 三、使用 `Db::raw()` 执行原生表达式 当需要复杂函数时,使用原生表达式: ```php use think\Db; // 示例:调用 MySQL 的 IF 函数 $data = User::field('id, name, Db::raw("IF(score>60,'及格','不及格') AS result")') ->select(); // 示例使用 MD5 函数 $user = User::where('password', Db::raw('MD5("123456")')) ->find(); ``` ### 📌 四、在模型方法中封装数据库函数 在模型中自定义方法封装复杂逻辑: ```php namespace app\model; use think\Model; class User extends Model { // 封装距离计算函数 public function scopeNearby($query, $lat, $lng) { return $query->field([ 'id', 'name', Db::raw("ROUND(6371 * ACOS( COS(RADIANS($lat)) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS($lng)) + SIN(RADIANS($lat)) * SIN(RADIANS(latitude)) ), 2) AS distance") ]); } } // 调用示例 $nearUsers = User::nearby(31.2304, 121.4737) ->order('distance ASC') ->select(); ``` ### 📌 五、使用 SQL 构建器表达式 通过表达式类构建复杂函数: ```php use think\db\Expression; // 示例:调用 JSON 函数 $data = Product::field([ 'id', 'name', new Expression("JSON_EXTRACT(specs, '$.weight') AS weight") ]) ->select(); ``` ### ⚠️ 注意事项 1. **安全防范** 使用 `Db::raw()` 时需手动过滤外部参数,防止 SQL 注入: ```php $safeParam = htmlspecialchars($input); Db::raw("UPPER('{$safeParam}')") ``` 2. **跨数据库兼容** 不同数据库的函数名可能不同(如 MySQL 的 `NOW()` 和 SQLite 的 `DATETIME('now')`),建议使用: ```php // 获取当前时间(数据库无关) Db::raw('now()') ``` 3. **模型事件结合** 在模型事件中调用数据库函数: ```php class User extends Model { protected static function onBeforeInsert($user) { $user->register_ip = request()->ip(); $user->register_time = Db::raw('NOW()'); } } ``` ### 💡 最佳实践场景 | 场景 | 推荐方法 | 示例 | |------|----------|------| | 简单聚合统计 | 内置聚合方法 | `User::sum('score')` | | 字段计算转换 | `field()` + 表达式 | `CONCAT(first_name, last_name)` | | 复杂函数逻辑 | `Db::raw()` | `MD5(password)` | | 复用计算逻辑 | 模型自定义方法 | 封装距离计算 | 通过以上方法,您可以在 ThinkPHP5 模型中灵活调用各种数据库函数,同时保持代码的可读性和安全性[^1][^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值