Yii框架和ThinkPHP作为主流的PHP开发框架,在数据库操作层面采用了不同的设计思路,Yii的Query查询构建器和ThinkPHP的链式操作各有优势,下面从多个场景对比两者的使用差异。

基础查询操作对比
Yii框架Query查询写法
Yii框架通过Yii::$app->db->createCommand()或者Query对象来构建查询,语法偏向显式声明查询参数。
<?php
// 查询user表中id大于10的所有记录
$query = new yiidbQuery();
$list = $query->select('*')
->from('user')
->where(['>', 'id', 10])
->all();
// 查询单条记录
$one = $query->select('username,email')
->from('user')
->where(['id' => 5])
->one();
?>
ThinkPHP链式操作写法
ThinkPHP的数据库操作采用链式调用语法,通过连续的调用方法拼接查询条件,代码更简洁紧凑。
<?php
// 查询user表中id大于10的所有记录
$list = Db::name('user')
->where('id', '>', 10)
->select();
// 查询单条记录
$one = Db::name('user')
->field('username,email')
->where('id', 5)
->find();
?>
条件拼接与复杂查询对比
多条件组合查询
当需要处理多个查询条件时,两种框架的实现方式有所不同。
Yii框架多条件处理
<?php
$query = new yiidbQuery();
$list = $query->select('*')
->from('order')
->where(['and',
['status' => 1],
['>=', 'create_time', strtotime('2024-01-01')],
['like', 'order_no', 'TEST']
])
->orderBy('id DESC')
->limit(10)
->all();
?>
ThinkPHP多条件处理
<?php
$list = Db::name('order')
->where('status', 1)
->where('create_time', '>=', strtotime('2024-01-01'))
->whereLike('order_no', 'TEST%')
->order('id', 'desc')
->limit(10)
->select();
?>
增删改操作对比
新增数据操作
两种框架的新增数据操作都支持数组传参,写法差异主要体现在方法命名上。
Yii框架新增数据
<?php
// 方式一:使用createCommand
Yii::$app->db->createCommand()->insert('user', [
'username' => 'test_user',
'email' => 'test@ipipp.com',
'create_time' => time()
])->execute();
// 方式二:Query对象方式
$query = new yiidbQuery();
$query->createCommand()->insert('user', [
'username' => 'test_user2',
'email' => 'test2@ipipp.com'
])->execute();
?>
ThinkPHP新增数据
<?php
// 新增单条数据
Db::name('user')->insert([
'username' => 'test_user',
'email' => 'test@ipipp.com',
'create_time' => time()
]);
// 获取新增ID
$userId = Db::name('user')->insertGetId([
'username' => 'test_user2',
'email' => 'test2@ipipp.com'
]);
?>
更新与删除操作
| 操作类型 | Yii框架写法 | ThinkPHP写法 |
|---|---|---|
| 更新数据 |
Yii::$app->db->createCommand()->update('user',
['email' => 'new@ipipp.com'],
['id' => 5]
)->execute(); |
Db::name('user')->where('id', 5)
->update(['email' => 'new@ipipp.com']); |
| 删除数据 |
Yii::$app->db->createCommand()->delete('user',
['id' => 5]
)->execute(); |
Db::name('user')->where('id', 5)->delete(); |
两种操作方式的适用场景
Yii的Query查询构建器更适合需要动态拼接复杂查询条件的场景,条件参数可以灵活组合,对于复杂SQL的兼容性更好。而ThinkPHP的链式操作语法更简洁,代码可读性更高,适合常规业务场景的快速开发,减少代码编写量。开发者可以根据项目的实际需求和团队的技术栈选择合适的数据库操作方式。