# 建表
## 文章分類表
### 建表語句
~~~SQL
DROP TABLE IF EXISTS `article_category`;
CREATE TABLE `article_category` (
`id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父級ID',
`title` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分類名稱',
`order` smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序',
`seo_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'seo標題',
`seo_keywords` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'seo關鍵詞',
`seo_description` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'seo摘要',
`created_at` timestamp NULL DEFAULT NULL COMMENT '添加時間',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改時間',
PRIMARY KEY (`id`) USING BTREE,
INDEX `menu_join`(`parent_id`) USING BTREE,
INDEX `index_list`(`title`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文章分類表' ROW_FORMAT = Dynamic;
~~~
>這里設置的很多字段不為空 所以表單提交的時候 非必填的字段需要給默認值
### 代碼生成
找到后臺:`開發工具` -> `代碼生成器` 選擇 `article_category` 表生成代碼
系統會自動生成該表對應的增刪改查
添加路由: `app\Admin\routes.php`
~~~php
...
Route::group([
...
], function (Router $router) {
...
$router->resource('/article_category', 'ArticleCategoryController');
});
~~~
>dcat-admin的大多數路由 都是這樣設置 `$router->resource('/{表名}', '{控制器}');`
### 創建菜單
創建網站菜單 `文章` 路徑不填寫
創建`文章`菜單的二級菜單`分類` 路徑填寫 `/article_category`
### 修改表單代碼
`app\Admin\Controllers\ArticleCategoryController.php`
~~~php
protected function form()
{
return Form::make(new ArticleCategory(), function (Form $form) {
$articleCategoryModel = new \App\Models\ArticleCategory();
$form->display('id');
$form->select('parent_id', '上級')
->options($articleCategoryModel->selectOptions(null, '頂級'))
->saving(function ($v) {
return (int) $v;
})
->default(0)
->required();
$form->text('title', '名稱')->required();
$form->text('order', '排序')->required();
$form->text('seo_title', 'SEO標題')
->saving(function ($v) {
return (string) $v;
});
$form->text('seo_keywords', 'SEO關鍵詞')
->saving(function ($v) {
return (string) $v;
});
$form->textarea('seo_description', 'SEO描述')
->saving(function ($v) {
return (string) $v;
});
$form->display('created_at');
$form->display('updated_at');
});
}
~~~
模型添加方法 `selectOptions`
~~~php
use Dcat\Admin\Traits\ModelTree;
class ArticleCategory extends Model
{
use ModelTree;
public function selectOptions(\Closure$closure = null, $rootText = null)
{
$options = (new static())->withQuery($closure)
->buildSelectOptions();
return collect($options)
->prepend($rootText, 0)
->all();
}
}
~~~
>這里是參考了 dacat-admin 的寫法 樹形結構數據 一般分類都會用到
這里可以先把所有的分類都加上 `關于我們` `跨境電商` `國際快遞` `FBA派送` `幫助中心`
幫助中心二級: `行業新聞` `物流知識`
>加上二級分類是為了在重做列表時可以看到分類結構
### 修改列表代碼
`app\Admin\Controllers\ArticleCategoryController.php`
~~~php
use Dcat\Admin\Layout\Content;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Tree;
public function index(Content $content)
{
return $content->header('文章分類')
->body(function (Row $row) {
$tree = new Tree(new ArticleCategory);
$tree->branch(function ($branch) {
return "{$branch['id']} - {$branch['title']}";
});
$row->column(5, $tree);
});
}
~~~
> dcat-admin 默認列表的方法是 `index` 這里用到了系統的樹形結構