置顶

zblog教程笔记:数据库操作

作者:勇康博客网 | 分类:MySQL | 浏览:778 | 日期:2022年06月17日

前言

对于一个后端程序员来说,我觉得最基本也是最应该熟练的东西就是对数据的增、删、改、查操作了。用zblog建站也有一段时间了,一直苦于没有时间去仔细研究一下zblog的用法,只是觉得zblog对于博客站而言非常的好用,不管是拓展性还是它目前的生态,我觉得都是建博客站的首选,wordpress我之前也用过,但是相比较而言,我个人更倾向于zblog。

写这篇文章的目的第一因为是怕忘记,以后用起来方便;第二就是自己做个总结,官方文档写的很广泛,而我打算记录的是一些经常用、并且很实用的操作方法。

新增数据表

下面是官方文档给出的创建表的方法,觉得不是很好用,可能还没用习惯吧。

//创建表
$tableData = array(
    'a' => array('a', 'integer', '', 0, '主ID'),
    'i' => array('i', 'boolean', '', false),
    'k' => array('k', 'string', 250, ''),
    'o' => array('o', 'string', 'longtext', '', '备注为某字段'),
    'r' => array('r', 'float', '', ''),
);
$sql = $zbp->db->sql->get()->create('zbp_test_table')
    ->data($tableData)
    ->option(array('engine' => 'InnoDB'))
    ->option(array('charset' => 'utf8mb4'))
    ->option(array('collate' => 'utf8mb4_general_ci'))
    ->sql;
$zbp->db->query($sql);
echo $sql;

//创建后的表结构如下
CREATE TABLE `zbp_test_table` (
  `a` int(11) NOT NULL AUTO_INCREMENT COMMENT '主ID',
  `i` tinyint(1) NOT NULL DEFAULT '0',
  `k` varchar(250) NOT NULL DEFAULT '',
  `o` longtext NOT NULL COMMENT '备注为某字段',
  `r` float NOT NULL DEFAULT '0',
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert语句

$sql = $zbp->db->sql->get()->insert($zbp->table['Post'])
    ->data(array('log_Title' => 'test','log_Type' => '0'))
    ->sql;
    
//对应sql预计如下
INSERT INTO zbp_post (log_Title,log_Type) VALUES ( 'test' , '0' )

update语句

$sql = $zbp->db->sql->get()->update($zbp->table['Post'])
    ->where('=', 'log_ID', 1)
    ->data(array('log_Title' => 'test','log_Type' => '1'))
    ->sql;

//打印sql语句如下
PDATE zbp_post SET log_Title = 'test', log_Type = '1' WHERE log_ID = '1'

delete语句

$sql = $zbp->db->sql->get()->delete($zbp->table['Post'])
    ->where('=', 'log_ID', 1)
    ->sql;
    
//打印sql语句如下
DELETE FROM zbp_post WHERE log_ID = '1'

select语句

GetListType方法(返回数组包含对象):

// 取category表所有的数据
$sql = $zbp->db->sql->get()->select($zbp->table['Category'])->sql;
$array = $zbp->GetListType('Category', $sql);
// 遍历数据输出等
foreach ($array as $a) {
    ...
}

//打印结果如下
就不复制了,数据结构就是外层数组,内部为对象;[object,object,object]

但是我觉得应用场景这么写就够了

// 取category表所有的数据
$sql = $zbp->db->sql->get()->select($zbp->table['Category'])->query;

//打印出来的就是纯数组格式,但是有个弊端字段和value值重复了,得做一次格式化

场景二:(查询表指定字段)

//官方写法
//取category表的ID字段数组
$sql = $zbp->db->sql->get()->selectany('cate_ID')->from($zbp->table['Category'])->sql;
$array = $zbp->db->query($sql);

//其实可以一步到位
$array = $zbp->db->sql->get()->selectany('cate_ID')->from($zbp->table['Category'])->sql;

//打印结果如下:
array(1) {
  [0]=>
  array(2) {
    ["cate_ID"]=>
    string(1) "1"
    [0]=>
    string(1) "1"
  }
}

ps:测试表明将from换成select返回结果都一样,selectany('cate_ID','cate_Name')或selectany('cate_ID,cate_Name')这两种写法都行
selectany换成column也没问题

//自定义表
$data_info['yk_cool_summer_slide'] = array(
    'id' => array('id', 'integer', '', 0),
    'url' => array('url', 'string', 255, ''),
    'sort' => array('sort', 'integer', '', 0),
    'link' => array('link', 'string', 255, ''),
    'content' => array('content', 'string', 'longtext', ''),
);
$sql = $zbp->db->sql->get()->from($zbp->table['yk_cool_summer_slide'])->sql;
$slide_list = $zbp->GetListCustom($zbp->table['yk_cool_summer_slide'], $data_info['yk_cool_summer_slide'], $sql);

//结构 [object,object]

场景三:拼接where语句

//官方写法
$sql = $zbp->db->sql->get()->select($zbp->table['Post'])
        ->column('ID,Status,Type')
    ->where(array('=', 'log_Status', "1"))
    ->where(array('=', 'log_Type', "0"))
    ->sql;
$articles = $zbp->GetListType('Post', $sql);

//多个where条件也可以这么写
$w = array();
$w[] = array('=', 'log_Type' ,'0');
$w[] = array('=', 'log_AuthorID' ,'1');
$w[] = array('=', 'log_CateID' ,'2');
// 作为参数使用
->where($w)

//得到的是数据包含对象的数据结构

场景四:or运算符

$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
    ->where(
        array('or',
            array(
                array('log_ID', '1'),
                array('log_Title', '2'),
            ),
        )
    )
    ->sql;
// 注意,此处的条件也可以写为->where('or',array('=', 'log_ID', '1'),array('=', 'log_Title', '2'))

//打印sql如下
SELECT * FROM zbp_post WHERE ((1 = 1) AND ( log_ID = '1' OR log_Title = '2' ) )

场景五:like操作符

//like和search的区别是search是左右模糊查询
$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
    ->where(array('search', 'log_Title', "Test"))
    ->sql;
    
//打印sql如下
SELECT * FROM zbp_post WHERE ((1 = 1) AND ((log_Title LIKE '%Test%')))

场景六:in和not in操作符

//in
$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
    ->where(array('IN', 'log_ID', array(1, 2, 3, 4)))
    ->sql;
    
//对应sql语句
SELECT * FROM zbp_post WHERE ((1 = 1) AND (log_ID IN ( '1' , '2' , '3' , '4' ) ) )    
    
//not in 
$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
    ->where(array('NOT IN', 'log_ID', '(1, 2, 3)'))
    ->sql;
    
//对应sql语句    
SELECT * FROM zbp_post WHERE (log_ID NOT IN (1, 2, 3))

场景七:between操作符

$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
    ->where(array('between', 'log_ID', "1", "3"))
    ->sql
    
//对应sql语句
SELECT * FROM zbp_post WHERE (log_ID BETWEEN '1' AND '3')

场景八:limit操作符

$sql = $zbp->db->sql->get()->select($zbp->table['Post'])
    ->limit(5, 10)
    ->sql;
    
//sql语句 检索记录行从第 6 行开始,返回最多 10 行
SELECT * FROM zbp_post LIMIT 10 OFFSET 5

场景九:order by语句

$sql = $zbp->db->sql->get()->select($zbp->table['Post'])
                           ->orderBy(array('log_PostTime' => 'desc'), array('log_ID' => 'asc'))
                           ->sql;

SELECT * FROM zbp_post ORDER BY log_PostTime DESC, log_ID ASC

场景十:group by语句

//取出每个作者的所有文章的总评论数
$sql = $zbp->db->sql->get()->select($zbp->table['Post'])
                           ->sum('log_CommNums')
                           ->groupBy('log_AuthorID')
                           ->sql;

SELECT SUM(log_CommNums) FROM zbp_post GROUP BY log_AuthorID

场景十一:having语句

//以下示例为取出分类下文章评论总数大于 100 的所有的分类:
$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
                           ->column('log_CateID')
                           ->column('SUM(log_CommNums)')
                           ->groupby('log_CateID')
                           ->having(array('>', 'SUM(log_CommNums)', '100'))
                           ->sql;

SELECT log_CateID,SUM(log_CommNums) FROM zbp_post GROUP BY log_CateID HAVING SUM(log_CommNums) > 100

场景十二:join语句

$sql = $zbp->db->sql->get()->selectany('log_ID')
                           ->from(array($zbp->table['Post']=>'p'))
                           ->leftjoin(array('zbp_postrelation'=>'pr'))
                           ->on('p.log_ID = pr.pr_PostID')
                           ->where('1 = 1')
                           ->sql;

// 这里只举例了 LEFT JOIN 联表查询,还分别给 2 个表分别设了别名

SELECT log_IDFROM zbp_post AS p LEFT JOIN zbp_postrelation AS pr ON p.log_ID = pr.pr_PostID WHERE 1 = 1

删表

$sql = $zbp->db->sql->get()->drop()->table('zbp_table2')->ifexists()->sql;

DROP TABLE IF EXISTS zbp_table2

随机取记录

//这里举例取5篇文章
$sql = $zbp->db->sql->get()->select($zbp->table['Post'],)
                           ->where('=','log_Type',0)
                           ->random(5)
                           ->sql;

//或使用内置函数GetList
GetList(array('random'=>4,'cate'=>1)); // 获取分类1下的随机4篇文章

事务处理

// 开始一个事务
$zbp->db->sql->get()->transaction('begin')->query;
// 中间sql处理
// 提交事务
$zbp->db->sql->get()->transaction('commit')->query;

发表评论

取消
微信二维码
微信二维码
支付宝二维码