数据库操作

阿里巴巴集团是一家大型的互联网企业,其数据库设计标准和最佳实践非常重要。以下是创建表语句的示例。 ## 表设计规范 1. **表名**:使用小写字母和下划线命名,可以使用单数或复数形式。 2. **字段名**:使用小写字母和下划线命名,必须具有意义,不建议使用缩写词。 3. **字段类型**:根据实际存储情况选择合适的数据类型。 4. **主键**:每个表必须有主键,主键值不能为NULL,建议使用auto_increment类型。 5. **索引**:必须对查询频繁的字段添加索引,但不要过度使用索引。 6. **外键**:建议在关联表之间使用外键,确保数据完整性,防止脏数据。 ## 创建表语句 下面是一个示例创建用户表的SQL语句: CREATE TABLE `user` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', `password` char(32) NOT NULL DEFAULT '' COMMENT '密码', `age` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '年龄', `gender` enum('male', 'female') NOT NULL DEFAULT 'male' COMMENT '性别', `email` varchar(128) NOT NULL DEFAULT '' COMMENT '电子邮件', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_username` (`username`) USING BTREE, KEY `idx_gender_age` (`gender`, `age`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';   - 使用InnoDB存储引擎,支持事务和外键。 - id为主键,并使用auto_increment自增。 - username字段添加UNIQUE索引,确保唯一性。 - gender和age字段添加联合索引,以便进行年龄和性别的筛选。
数据库操作

扣库存

正在为您搜索:入库记录表、产品、多条入库记录、库存数量 在这种情况下,需要先按照入库时间对入库记录进行排序,然后对库存进行累加,再按照出库时间对出库记录进行排序,最后根据出库记录逐条扣减库存。 以下是使用 ThinkPHP 框架实现上述逻辑的代码示例: ```php // 获取指定产品的所有入库记录 $stockIns = Db::name('stock_in')->where('product_id', $productId)->order('created_at')->select(); // 计算每一条入库记录时累加库存 $stockTotal = 0; foreach ($stockIns as &$stockIn) { $stockTotal += $stockIn; $stockIn = $stockTotal; } // 获取指定产品的所有出库记录 $stockOuts = Db::name('stock_out')->where('product_id', $productId)->order('created_at')->select(); // 逐条扣减库存 foreach ($stockOuts as $stockOut) { $stockIn = end(array_filter($stockIns, function($stockIn) use ($stockOut) { return $stockIn <= $stockOut; })); if (empty($stockIn)) { throw new Exception('无法找到对应的入库记录'); } if ($stockIn < $stockOut) { throw new Exception('库存不足'); } $stockIn -= $stockOut; Db::name('stock_in')->where('id', $stockIn)->update(]); } ``` 以上代码假设 `stock_in` 表和 `stock_out` 的表结构分别如下: ```sql CREATE TABLE `stock_in` ( `id` int(11) NOT NULL AUTO_INCREMENT, `product_id` int(11) NOT NULL COMMENT '产品 ID', `amount` int(11) NOT NULL COMMENT '入库数量', `created_at` datetime NOT NULL COMMENT '入库时间', `total` int(11) NOT NULL COMMENT '累计库存', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库记录表'; CREATE TABLE `stock_out` ( `id` int(11) NOT NULL AUTO_INCREMENT, `product_id` int(11) NOT NULL COMMENT '产品 ID', `amount` int(11) NOT NULL COMMENT '出库数量', `created_at` datetime NOT NULL COMMENT '出库时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库记录表'; ``` 其中,`stock_in` 表中的 `total` 字段表示该次入库后的累计库存,是在读取时动态计算的。对于已经扣减库存的出库记录,在处理时实际上是更新它所对应的入库记录的 `total` 字段。     假设数据库中有以下两个表:`product`和`stock_in`,其中`product`表存储产品信息,包括产品编号、名称等;`stock_in`表存储入库记录,包括入库单号、产品编号、入库数量、入库时间等。 在这种情况下,需要扣除库存的操作可以通过以下步骤实现: 1. 查询某个产品的所有入库记录,按照入库时间升序排列,保存记录集合。 2. 定义一个变量`$remain_stock`表示该产品当前的剩余库存量,初始值为0。 3. 遍历记录集合,对于每一条记录,执行以下操作: - 将该记录的入库数量加到`$remain_stock`上。 - 如果`$remain_stock`大于等于要扣除的库存数量,则修改该记录的入库数量,并将`$remain_stock`减去扣除的库存数量,然后退出循环。 - 如果`$remain_stock`小于要扣除的库存数量,则将该记录的入库数量修改为0,并将`$remain_stock`减去该记录的入库数量,继续循环。 4. 如果遍历完所有记录后`$remain_stock`仍大于要扣除的库存数量,则抛出异常提示库存不足;否则,更新`product`表中该产品的库存数量为`$remain_stock`。 下面是具体的代码实现,假设要扣除的库存数量为`$num`,产品编号为`$product_id`: ```php // 查询某个产品的所有入库记录 $stock_ins = Db::table('stock_in') ->where('product_id', $product_id) ->order('create_time asc') ->select();
扣库存

thinkphp6 定时任务

  php think xsync:bill $output->info(json_encode($data)); p();打印文件 $this->app->log->notice(json_encode($params));打印日志文件 $this->app->log->info('下单', );
thinkphp6 定时任务

mysql 常用

根据某个值,查询在数据库中属于那个区间。 SELECT T1.* FROM ( SELECT 4.3 AS S_VALUE ) T INNER JOIN ware_fee T1 ON T.S_VALUE >= T1.min AND T.S_VALUE < T1.max AND type=1 AND store_id=2 and c_id=377
mysql 常用

管理后台操作

SystemBase::mForm('form'); public function state() { ShopGoods::mSave($this->_vali(), 'code'); } SystemBase::mDelete(); WareInfo::mDelete('ware_id');//ware_id为主键 DataUserBalance::mDelete('', ]); public function remove() { ShopGoods::mSave($this->_vali(), 'code'); } protected function _delete_result() { $this->_form_result(true); }  
管理后台操作

thinkPHP6 CURD

//增 DataUserTransfer::mk()->insertGetId($data) SystemNode::mk()->insertAll($data); DataUserAddress::mk()->insert($data); 删 按条件删除 SystemNode::mk()->where($map)->delete(); 清空数据 SystemOplog::mQuery()->empty(); //改 BasePostageCompany::mUpdate( , 'code_1' => $vo, 'code_2' => $vo, 'code_3' => $vo, 'deleted' => 0, ], 'code_1') BaseUserMessage::mk()->where()->inc('num_read')->update(); ShopOrder::mk()->where($map)->update() $data = DataUserAddress::mk()->where($map)->find(); if (empty($data)) $this->error('需要删除的地址不存在!'); if ($data->save() !== false) { $this->success('删除地址成功!'); } else { $this->error('删除地址失败!'); } //查 BaseUserUpgrade::mk()->where($map)->value('rebate_rule', ''); SystemNode::mk()->where($map)->column('node'); SystemMenu::mk()->order('sort desc,id asc')->column('id,pid,icon,url,node,title,params', 'id'); $map = , 'is_deleted' => 0]; $user = SystemUser::mk()->where($map)->findOrEmpty(); $user->inc('login_num')->update(); $user = SystemUser::mk()->find($data); if (!empty($user) && $user->save())])) { sysoplog('系统用户管理', "修改用户}]密码成功"); $this->success('密码修改成功,请使用新密码登录!', ''); } else { $this->error('密码修改失败,请稍候再试!'); } $query = ShopOrder::mk()->alias('a')->field('b.goods_code,b.goods_spec,ifnull(sum(b.stock_sales),0) stock_sales'); $query->leftJoin('shop_order_item b', 'a.order_no=b.order_no')->where("b.goods_code='{$code}' and a.status>0 and a.deleted_status<1"); $salesList = $query->group('b.goods_code,b.goods_spec')->select()->toArray(); //统计 DataUserTransfer::mk()->where($map)->count(); //事务 $this->app->db->transaction(function () use ($order, $items) { ShopOrder::mk()->insert($order); ShopOrderItem::mk()->insertAll($items); });  
thinkPHP6 CURD

column()使用

应用 $users = SystemUser::mk()->column('nickname,username', 'id'); $this->success('获取成功', $users); { "code": 1, "info": "获取成功", "data": { "10000": { "nickname": "系统管理员", "username": "admin", "id": 10000 }, "10001": { "nickname": "aass", "username": "assa", "id": 10001 } } } $users = SystemUser::mk()->column('nickname,username'); $this->success('获取成功', $users); { "code": 1, "info": "获取成功", "data": } $users = SystemUser::mk()->column('nickname,username'); $user = array_unique(array_column($users, 'username')); $this->success('获取成功', $user); { "code": 1, "info": "获取成功", "data": } $a = ; $this->success('获取成功', arr2str($a)); "data": ",语文,属性," $a = '1,2,3,4'; $this->success('获取成功', str2arr($a)); { "code": 1, "info": "获取成功", "data": }      
column()使用

thinkPHP6多表查询

  thinkphp 跨表查询   //多表查询 public function index() { $this->title = '用户提现管理'; $this->transfer = UserTransferService::instance()->amount(0); // 创建查询对象 $query = DataUserTransfer::mQuery()->order('id desc'); // 用户条件搜索 $db = DataUser::mQuery()->like('phone,username|nickname#nickname')->db(); if ($db->getOptions('where')) $query->whereRaw("uuid in {$db->field('id')->buildSql()}"); // 数据列表处理 $query->equal('type,status')->dateBetween('create_at')->page(); }   生成的sql语句 SELECT * FROM `data_user_transfer` WHERE ( uuid in ( SELECT `id` FROM `data_user` WHERE ( `username` LIKE '%小白%' OR `nickname` LIKE '%小白%' ) ) ) ORDER BY `id` DESC LIMIT 0,20    
thinkPHP6多表查询