
新增模块
从创建数据表到实现最基础增删改查的实现过程
创建数据库
ID | 编号 | 名称 | 描述 |
---|---|---|---|
id | serial | name | describe |
- 数据表相关属性
创建数据模型
创建数据表对应的model文件,目录在app/model下,该目录下的文件夹是以功能模块进行分类的,我们先创建一个test文件夹。创建数据表模型Test.php文件。
<?php
namespace app\model\Test;
use madong\basic\BaseLaORMModel;
class Test extends BaseLaORMModel
{
/**
* 数据表主键
*
* @var string
*/
protected $primaryKey = 'id';
protected $table = 'test';
}
- 模型类必须要继承基础模型 继承BaseTpORMModel。
- 设置主键
protected $primaryKey = 'id';
- 设置表名称
protected $table = 'test';
INFO
设置完成之后,此Model会和数据表进行关联,是程序对表进行操作的重要一个环节创建完成model类之后,接下来我们开始完成Dao层数据操作的功能实现。
创建dao层数据库操作
在app/dao文件下创建test文件夹,并创建StudentDao.php的Dao层文件。创建完成之后,需要继承BaseDao,并设置之前创建的Test模型
<?php
namespace app\dao\test;
use app\model\Test\Test;
class TestDao
{
protected function setModel(): string
{
return Test::class;
}
}
- 设置操作的对应模型
protected function setModel(): string
{
return Test::class;
}
在这里,我们对数据表的增删改查分别写一个方法,查询分为多条和单条,一共五个方法。 使用$this->getModel()方法可以获取在上方设置的模型实例化对象,该文件下的所有方法都可以使用此方法进行模型的实例化,
- 1、 新增数据时,使用 $this->getModel()->create($data);即可实现数据的新增逻辑,$data为想要新增的数据,返回模型实例。
/**
* 新增
*
* @param array $data
*
* @return \app\model\Test\Test|null
*/
public function add(array $data):?Test
{
return $this->getModel()->create($data);
}
- 2、 对于数据的查询,分为单条和多条查询,我们在这里分为两个方法去实现。同理使用 $this->getModel()->where($where)->frist();可以实现单条查询的逻辑,$where是查询的条件,例如:$where = [‘name’=>’李强’],这个条件就是查询name姓名为李强的数据对象。如果使用主键进行单条查询,可以直接使用$this->get($id)的方法获取。
/**
* 根据条件获取一条数据
*
* @param array $where
*
* @return \app\model\Test\Test|null
*/
public function read(array $where): ?Test
{
return $this->getModel()->where($where)->first();
}
多条数据查询,如果不分页的情况下,写法和单条一样,只是将first()改为get(),如果需要分页查询需要传入page和limit(当前页数和每页条数)然后进行分页查询
/**
* 查询列表
*
* @param array $where
* @param int $page
* @param int $limit
*
* @return mixed
*/
public function getList(array $where = [], int $page = 0, int $limit = 0)
{
$query = $this->getModel()->query();
// 根据条件添加查询
if (!empty($where)) {
$query->where($where);
}
// 如果传入了分页参数,则进行分页查询
if ($limit > 0 && $page > 0) {
return $query->paginate($limit, ['*'], 'page', $page);
}
// 否则,返回所有符合条件的记录
return $query->get();
}
if判断了当page和limit传入的数据都大于0的时候才会进行分页查询,如果传入0或者不传,则默认查询全部的数据
- 3、 修改数据,修改数据需要传入一个条件和一个需要修改的数组变量,根据条件去修改对应的数据,$where负责查询对应的数据,将对应的数据修改成$data里面携带的参数,注意,$where和$data里面的数组键必须是数据表里面存在的字段,此方法可以修改单条或者多条,取决于$where的查询是单条还是多条,会返回被修改的数据条数。
public function edit(array $conditions, array $data): array
{
$query = $this->getModel()->query();
foreach ($conditions as $field => $value) {
$query->where($field, $value);
}
$updated = $query->update($data);
return [
'success' => $updated > 0,
'updated_count' => $updated,
];
}
- 4、 删除数据,如果数据表里面设置的删除的字段,可以使用修改的方法将字段进行修改做到软删除,如果需要直接删除数据,则可是使用delete()方法。
/**
* 删除
*
* @param array $where
*
* @return array
*/
public function del(array $where): array
{
$query = $this->getModel()->query();
foreach ($where as $field => $value) {
$query->where($field, $value);
}
$deletedCount = $query->delete();
return [
'success' => $deletedCount > 0,
'deleted_count' => $deletedCount,
];
}
创建service服务层处理文件
在app/services文件下创建test文件夹,并创建TestServices.php的services层文件。创建完成之后,需要继承BaseService,并设置TestDao 这里可以使用注入方式
<?php
namespace app\services\test;
use app\dao\test\TestDao;
use madong\basic\BaseService;
use support\Container;
class TestService extends BaseService
{
public function __construct()
{
$this->dao = Container::make(TestDao::class);
}
}
在本次项目中,我们专注于实现数据表的增删改查功能,而不对数据进行额外的处理。因此,在services文件中,我们可以选择直接写好对应的调用逻辑,当然,也可以选择不写具体的方法,因为系统能够自动定位并调用dao层的方法来完成这些操作。这样设计使得我们的代码更加简洁和高效。
class TestService extends BaseService
{
public function __construct()
{
$this->dao = Container::make(TestDao::class);
}
public function add(array $data)
{
return $this->dao->add($data);
}
public function read(array $where)
{
return $this->dao->read($where);
}
public function getList($where, $page, $limit)
{
return $this->dao->getnList($where, $page, $limit);
}
public function edit($where, $data)
{
return $this->dao->getnList($where, $data);
}
public function del(array $where)
{
return $this->dao->del($where);
}
public function del(array $where)
{
return $this->dao->del($where);
}
}
创建控制器文件
路由文件增加对应五个方法的路由,添加,查询单条,查询多条,修改,删除
<?php
namespace app\admin\controller\test;
use app\admin\controller\Crud;
use madong\utils\Json;
use support\Container;
use support\Request;
class TestController extends Crud
{
public function __construct()
{
parent::__construct();
$this->service = Container::make(TestService::class);
$this->validate = Container::make(TestValidate::class);//有需要添加
}
/**
* 列表
*
* @param \support\Request $request
*
* @return \support\Response
*/
public function index(Request $request): \support\Response
{
try {
[$where, $format, $limit, $field, $order, $page] = $this->selectInput($request);
$methods = [
'select' => 'formatSelect',
'tree' => 'formatTree',
'table_tree' => 'formatTableTree',
'normal' => 'formatNormal',
];
$format_function = $methods[$format] ?? 'formatNormal';
[$list, $total] = $this->service->getList($where, $page, $limit);
return call_user_func([$this, $format_function], $list, $total);
} catch (\Throwable $e) {
return Json::fail($e->getMessage());
}
}
/**
* 插入数据
*
* @param \support\Request $request
*
* @return \support\Response
*/
public function store(Request $request): \support\Response
{
try {
$data = $this->insertInput($request);
if (isset($this->validate) && $this->validate) {
if (!$this->validate->scene('store')->check($data)) {
throw new \Exception($this->validate->getError());
}
}
$model = $this->service->add($data);
if (empty($model)) {
throw new AdminException('插入失败');
}
$pk = $model->getPk();
return Json::success('ok', [$pk => $model->getData($pk)]);
} catch (\Throwable $e) {
return Json::fail($e->getMessage());
}
}
/**
* 查询详情
*
* @param \support\Request $request
*
* @return \support\Response
*/
public function show(Request $request): \support\Response
{
try {
$name = $request->route->param('name');
$data = $this->service->read(['name' => $name]);
if (empty($data)) {
throw new AdminException('数据未找到', 400);
}
return Json::success('ok', $data->toArray());
} catch (\Throwable $e) {
return Json::fail($e->getMessage(), [], $e->getCode());
}
}
/**
* 更新
*
* @param \support\Request $request
*
* @return \support\Response
*/
public function update(Request $request): \support\Response
{
try {
$name = $request->route->param('name');
$data = $this->insertInput($request);
if (isset($this->validate) && $this->validate) {
if (!$this->validate->scene('update')->check($data)) {
throw new \Exception($this->validate->getError());
}
}
$this->service->edit(['name' => $name], $data);
return Json::success('ok', []);
} catch (\Throwable $e) {
return Json::fail($e->getMessage());
}
}
/**
* 删除
*
* @param \support\Request $request
*
* @return \support\Response
*/
public function destroy(Request $request): \support\Response
{
try {
$where = $request->input('data', []);
if (empty($data)) {
throw new AdminException('参数错误');
}
$result = $this->service->del($where);
return Json::success('ok', $result);
} catch (\Throwable $e) {
return Json::fail($e->getMessage());
}
}
}
创建路由文件
- 路由文件增加对应五个方法的路由,添加,查询单条,查询多条,修改,删除
<?php
use Webman\Route;
Route::group(function () {
Route::poost('/test/add', [\app\admin\controller\test\TestController::class, 'store'])->name('保存');
Route::get('/test/show', [\app\admin\controller\test\TestController::class, 'show'])->name('详情');
Route::get('/test/page', [\app\admin\controller\test\TestController::class, 'index'])->name('列表');
Route::put('/test/update', [\app\admin\controller\test\TestController::class, 'update'])->name('更新');
Route::delete('/test/del', [\app\admin\controller\test\TestController::class, 'destroy'])->name('删除');
});
小结
系统中各个层级划分得十分清晰明确。Controller层负责数据的接收与发送,Services层专注于数据的逻辑处理与组合,DAO层则专注于对数据库进行增删改查操作,而Model层则代表了数据库的模型类。当我们深入理解并掌握了这些层级之间的逻辑关系与文件结构后,未来的开发工作将会变得更加便捷与高效。