如何写一个属于自己的数据库封装(4)
测试数据库来源
其实应该第一期就交出的, 但现在提起也无碍
参考了安装mysql示例数据库sakila
情景描述
我有一个用于测试的数据库(sakila), 里头有一个表(actor), 现在我们将它和Model类绑定就可以很轻松写意地读取数据了
首先, 新建一个类, 类名随意, 但建议和表名一致
Actor.php
<?php /** * 数据库中的Actor表 * 继承Model的属性和函数 */ class Actor extends Model { // 由于我们的数据库表名和当前的类名是一样的,可以直接省略这一步 // protected $table = 'Actor'; // 设置Actor表的主键 protected $identity = 'actor_id'; // 或者设置unique key // 如果unique key只有一个 // protected $unique = 'actor_id'; // 如果多个unique key // protected $unique = ['first_name', 'last_name']; }
发现了吗?是不是非常的简洁? 除开所有注释你甚至只需一行就设置完毕了
举个例子
无需条件我就只是想读取表里的所有数据
<?php /** * 特别预告 * 想必有人发现需要require的文件可能多了一些 * 这可以用自动载入来解决 * 敬请期待 */ // 辅助函数我都写helper里了 require 'lib/helper.php'; require 'lib/Connector.php'; require 'lib/Builder.php'; require 'lib/Grammar.php'; require 'lib/Model.php'; require 'model/Actor.php'; $a = Actor::get(); dd($a);
返回结果
array (size=197) 0 => object(Actor)[207] public 'actor_id' => string '1' (length=1) public 'first_name' => string 'PENELOPE' (length=8) public 'last_name' => string 'GUINESS' (length=7) public 'last_update' => string '2006-02-15 04:34:33' (length=19) 1 => object(Actor)[211] public 'actor_id' => string '2' (length=1) public 'first_name' => string 'NICK' (length=4) public 'last_name' => string 'WAHLBERG' (length=8) public 'last_update' => string '2006-02-15 04:34:33' (length=19) 2 => object(Actor)[215] public 'actor_id' => string '3' (length=1) public 'first_name' => string 'ED' (length=2) public 'last_name' => string 'CHASE' (length=5) public 'last_update' => string '2006-02-15 04:34:33' (length=19) 3 => object(Actor)[219] public 'actor_id' => string '4' (length=1) public 'first_name' => string 'JENNIFER' (length=8) public 'last_name' => string 'DAVIS' (length=5) public 'last_update' => string '2006-02-15 04:34:33' (length=19) // 更多数据......
可读性更高且适用于当前要求的写法
// 这回多一个小要求, 我只想看以下两个声明的字段 $a = Actor::all(['first_name', 'last_name']);
或者
$a = Actor::select('first_name', 'last_name')->get();
返回结果
array (size=197) 0 => object(Actor)[207] public 'first_name' => string 'ADAM' (length=4) public 'last_name' => string 'GRANT' (length=5) 1 => object(Actor)[211] public 'first_name' => string 'ADAM' (length=4) public 'last_name' => string 'HOPPER' (length=6) 2 => object(Actor)[215] public 'first_name' => string 'AL' (length=2) public 'last_name' => string 'GARLAND' (length=7) 3 => object(Actor)[219] public 'first_name' => string 'ALAN' (length=4) public 'last_name' => string 'DREYFUSS' (length=8) ......
-
我想搜索first_name中包含L这个字母的数据, 但不要前5条数据, 取之后的10条数据, 想查看first_name和last_name这两个字段就足够了
最具可读性的写法,
再预告, 分页(paginate)的雏形就在这里$a = Actor::select('first_name', 'last_name') ->where('first_name', 'like', '%L%') ->skip(5) // 略过5条 ->take(10) // 拿取10条 ->get();
登录后复制返回结果
array (size=10) 0 => object(Actor)[20] public 'first_name' => string 'ANGELA' (length=6) public 'last_name' => string 'HUDSON' (length=6) 1 => object(Actor)[24] public 'first_name' => string 'ANGELA' (length=6) public 'last_name' => string 'WITHERSPOON' (length=11) 2 => object(Actor)[28] public 'first_name' => string 'ANGELINA' (length=8) public 'last_name' => string 'ASTAIRE' (length=7) 3 => object(Actor)[32] public 'first_name' => string 'BELA' (length=4) public 'last_name' => string 'WALKEN' (length=6) 4 => object(Actor)[36] public 'first_name' => string 'CHARLIZE' (length=8) public 'last_name' => string 'DENCH' (length=5) 5 => object(Actor)[40] public 'first_name' => string 'DARYL' (length=5) public 'last_name' => string 'CRAWFORD' (length=8) 6 => object(Actor)[44] public 'first_name' => string 'DARYL' (length=5) public 'last_name' => string 'WAHLBERG' (length=8) 7 => object(Actor)[48] public 'first_name' => string 'ELLEN' (length=5) public 'last_name' => string 'PRESLEY' (length=7) 8 => object(Actor)[52] public 'first_name' => string 'ELVIS' (length=5) public 'last_name' => string 'MARX' (length=4) 9 => object(Actor)[56] public 'first_name' => string 'EMILY' (length=5) public 'last_name' => string 'DEE' (length=3)
登录后复制想要更多的例子?留言吧我会在评论区给出函数链
调试小技巧
有时候可能对SQL语句的不理解导致跳BUG了, 这时候你想看看原生的SQL语句, 可以在Connector.php中的read()函数处, 这样加上
// 读取数据 public function read($sql, $bindings) { var_dump($sql); // 就是这一句 var_dump($bindings); // 还可以确认条件值是否正确对应 // 将sql语句放入预处理函数 $statement = $this->connection->prepare($sql); // 将附带参数带入pdo实例 $this->bindValues($statement, $bindings); // 执行 $statement->execute(); // 返回所有合法数据, 以Object对象为数据类型 return $statement->fetchAll(PDO::FETCH_OBJ); }
以最后一个例子为说明, 会输出这么两行
string 'select first_name, last_name from Actor where Actor.first_name like ? order by 1 asc limit 10 offset 5' (length=102) array (size=1) 0 => string '%L%' (length=3)
以上是如何写一个属于自己的数据库封装(4)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

全表扫描在MySQL中可能比使用索引更快,具体情况包括:1)数据量较小时;2)查询返回大量数据时;3)索引列不具备高选择性时;4)复杂查询时。通过分析查询计划、优化索引、避免过度索引和定期维护表,可以在实际应用中做出最优选择。

InnoDB的全文搜索功能非常强大,能够显着提高数据库查询效率和处理大量文本数据的能力。 1)InnoDB通过倒排索引实现全文搜索,支持基本和高级搜索查询。 2)使用MATCH和AGAINST关键字进行搜索,支持布尔模式和短语搜索。 3)优化方法包括使用分词技术、定期重建索引和调整缓存大小,以提升性能和准确性。

是的,可以在 Windows 7 上安装 MySQL,虽然微软已停止支持 Windows 7,但 MySQL 仍兼容它。不过,安装过程中需要注意以下几点:下载适用于 Windows 的 MySQL 安装程序。选择合适的 MySQL 版本(社区版或企业版)。安装过程中选择适当的安装目录和字符集。设置 root 用户密码,并妥善保管。连接数据库进行测试。注意 Windows 7 上的兼容性问题和安全性问题,建议升级到受支持的操作系统。

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

聚集索引和非聚集索引的区别在于:1.聚集索引将数据行存储在索引结构中,适合按主键查询和范围查询。2.非聚集索引存储索引键值和数据行的指针,适用于非主键列查询。

MySQL 和 MariaDB 可以共存,但需要谨慎配置。关键在于为每个数据库分配不同的端口号和数据目录,并调整内存分配和缓存大小等参数。连接池、应用程序配置和版本差异也需要考虑,需要仔细测试和规划以避免陷阱。在资源有限的情况下,同时运行两个数据库可能会导致性能问题。

MySQL 数据库中,用户和数据库的关系通过权限和表定义。用户拥有用户名和密码,用于访问数据库。权限通过 GRANT 命令授予,而表由 CREATE TABLE 命令创建。要建立用户和数据库之间的关系,需创建数据库、创建用户,然后授予权限。

MySQL支持四种索引类型:B-Tree、Hash、Full-text和Spatial。1.B-Tree索引适用于等值查找、范围查询和排序。2.Hash索引适用于等值查找,但不支持范围查询和排序。3.Full-text索引用于全文搜索,适合处理大量文本数据。4.Spatial索引用于地理空间数据查询,适用于GIS应用。
