1. 简介
针对Laravel的数据库设计,有人提倡使用Lavarel自身提供的“数据迁移”实现,即通过代码创建数据模型进而产生数据库表。此种方式操作相对不太直观且不太容易理解。对于数据库设计推荐使用统一的设计规范,以便于事后修改维护等诸多事务中得心应手。
数据库建模工具:MySQL Workbench
下载地址:https://dev.mysql.com/downloads/file/?id=468295
2. 数据库表结构
DROP TABLE IF EXISTS `member`;
CREATE TABLE IF NOT EXISTS `member` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`nickname` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '昵称',
`phone` VARCHAR(12) NOT NULL DEFAULT '' COMMENT '手机号码',
`email` VARCHAR(130) NOT NULL DEFAULT '' COMMENT '电子邮箱',
`password` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '密码',
`created_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY `id`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='会员表';
DROP TABLE IF EXISTS `category`;
CREATE TABLE IF NOT EXISTS `category` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '分类名',
`sort` SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序值',
`preview` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '预览图',
`pid` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级编号',
`created_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY `id`(`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1 COMMENT='商品分类';
DROP TABLE IF EXISTS `product`;
CREATE TABLE IF NOT EXISTS `product`(
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(60) NOT NULL DEFAULT '' COMMENT '商品名称',
`summary` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '商品简介',
`price` DECIMAL(8,2) UNSIGNED NOT NULL DEFAULT '0.00' COMMENT '商品单价',
`preview` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '预览图',
`created_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY `id`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='商品表';
DROP TABLE IF EXISTS `product_detail`;
CREATE TABLE IF NOT EXISTS `product_detail`(
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`content` text NOT NULL COMMENT '详情内容',
`product_id` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品编号',
`created_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY `id`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='商品详情';
DROP TABLE IF EXISTS `product_images`;
CREATE TABLE IF NOT EXISTS `product_images`(
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`path` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '图片路径',
`sort` SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序值',
`product_id` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '商品编号',
`created_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY `id`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='商品轮播图';
[注意] Laravel的Eloquent期望表中存在两个timestamp
时间戳类型的字段created_at
和updated_at
,并由系统自动维护。
3. 创建数据模型
在命令行中使用artisan
命令创建数据模型model
。
php artisan make:model member
自动生成的数据模型位于 app/Member.php
<?php
// 命名空间
namespace App;
// 引入核心文件
use Illuminate\Database\Eloquent\Model;
// 创建模型类,文件名与类名保持一致。
class Member extends Model
{
//数据库表名,默认类名用来当做表名,由此Eloquent自动推导出模型与表的关联。
protected $table = 'member';
//主键,Eloquent假定表中存在名为id的列作为主键
protected $primaryKey = 'id';
//时间戳,Eloquent期望表中存在created_at和updated_at字段。
protected $timestamp = true;
}
[疑惑] 数据模型是如何和数据表绑定的呢?
Laravel的
Eloquent ORM
提供了与数据库打交道的ActiveRecord实现,每张表均对应一个与之交互的模型,模型允许你在表中进行增删改查CURD等操作。
[测试] 修改默认路由文件 routes/web.php,使用浏览器查看结果。
<?php
// 引入模型
use App\Member;
Route::get('/', function () {
return Member::get();//获取表中所有记录
});
在app目录下从创建保存所有模型的Entity目录,复制Member.php并修改内容依次创建所有模型。也可采用命令方式依次创建:
php artisan make:model Entity/Category
php artisan make:model Entity/Product
php artisan make:model Entity/ProductDetail
php artisan make:model Entity/ProductImages
此时文件内容如下:
<?php
namespace App\Entity;
use Illuminate\Database\Eloquent\Model;
class ProductDetail extends Model
{
//数据库表名,默认类名用来当做表名,由此Eloquent自动推导出模型与表的关联。
protected $table = 'product_detail';
//主键,Eloquent假定表中存在名为id的列作为主键
protected $primaryKey = 'id';
//时间戳,Eloquent期望表中存在created_at和updated_at字段。
protected $timestamp = true;
}