## ORM配置
- [Laravel ORM](https://learnku.com/docs/laravel/8.5/eloquent/10409) 对于开发者来说是至关重要的
- ORM可以为开发省对数据库表创建操作,且稳定好用不倒腾
- 可能需要花费一些时间熟悉下 Laravel 的 Eloquent ORM
- 不熟悉 Eloquent ORM 也不影响往下继续学习
设置文件/html/plugins/tphp/demo/base/product/model.php内容如下
```
<?php
/**
* 如果表不存在,会自动创建表product表和字段
* 原来存在字段不会被删除和修改
*/
return [
// 表名
'table' => 'product',
// ORM內置方法
// 'guarded' => [],
// ORM內置方法或更多可以通过这里的数组设置,如guarded、fillable等
// 'fillable' => [],
// 是否生成创建时间和更新时间字段,默认create_time和update_time
// 默认为true
// 'timestamps' => true,
// 创建时间字段名
// env('CREATED_AT') 优先
// $createdAt = 'create_time',
// 创建时间字段名备注
// env('CREATED_AT_COMMENT') 优先
// $createdAtComment = '创建时间',
// 更新时间字段名
// env('UPDATED_AT') 优先
// $updatedAt = 'update_time',
// 更新时间字段名备注
// env('UPDATED_AT_COMMENT') 优先
// $updatedAtComment = '更新时间',
// 创建时间和更新时间的格式化
// 时间戳格式: U
// 时间戳格式会以int字段类型存储
// 日期格式: Y-m-d H:i:s
// 默认为日期格式
// $dateFormat = 'Y-m-d H:i:s',
'field' => function(Illuminate\Database\Schema\Blueprint $table){
// 更多字段使用方法请学习Laravel的Eloquent ORM使用说明
$table->increments('id')->comment('ID');
$table->string('name', 64)->comment('产品名称')->nullable();
$table->string('remark', 1024)->comment('产品描述')->nullable()->default('推荐');
},
// 预处理
// $hasTable: 是否存在product表
'before' => function ($hasTable) {
// 不会创建表 product - 默认
// 不会执行初始化
// 并且结束程序
// return false;
// 将继续执行操作;
return true;
},
// 初始化表数据,表创建时操作
'init' => function () {
// 或者
// return [
// [
// 'name' => 'test',
// 'remark' => '产品测试'
// ]
// ];
return [
'name' => 'test',
'remark' => '产品测试'
];
},
// 或者
// 'init' => [
// 'name' => 'test',
// 'remark' => '产品测试'
// ]
];
```
设置文件/html/plugins/tphp/demo/base/product/detail/model.php内容如下
```
<?php
return [
// 表名
'table' => 'product_detail',
'timestamps' => false,
'field' => function(Illuminate\Database\Schema\Blueprint $table){
$table->increments('id')->comment('ID');
$table->integer('product_id')->comment('产品ID');
$table->string('name', 64)->comment('详情名称')->nullable();
},
// 初始化表数据
'init' => [
[
'product_id' => 1,
'name' => '普通产品'
],
[
'product_id' => 1,
'name' => '高级产品'
],
]
];
```
设置文件/html/plugins/tphp/demo/html/www/base/orm/data.php内容如下
```
<?php
/**
* conn数据源配置可能在特殊情况下会使用到
* 比如mysql和sqlite数据库结合使用的时候
*/
return [
"type" => "sql",
"config" => [
// 冒号 ":" 表示在base目录中查找
// 没有冒号表示在database.php文件中查找
// 如果不习惯用点作为目录,可以这样: ":product/detail"
// 调用其他插件表: ":product.detail==tphp.demo",同时支持强匹配和弱匹配 '==' 和 '='
// 或者: ":product.detail==demo"
// 对应文件: base/product/detail/model.php
// 或者: 'table' => plu()->model('product.detail')->table,
"table" => ":product.detail",
// conn未设置时默认取用 domains.php中的conn配置
// 也可以是数组 "conn" => ['driver' => 'mysql' ...]
// 或者: 'conn' => plu()->model('product.detail')->conn,
// "conn" => "demo",
"field" => [
'id',
'name',
[
[
// 冒号支持子查询
// 默认为本文件 conn 数据源,如果本文件未配置,则以domains.php的conn配置为准
// 对应文件: base/product/model.php
// 可以这样: [':product', 'demo'],
/*
* 也可以这样:
[
':product',
[
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'demo',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
]
],
*/
':product',
// :product 表的 id
'id',
// :product.detail 表的 product_id
'product_id',
[
// :product 表的 name
// 因为name名冲突,所以需重新命名 name
'name' => 'product_name'
]
]
]
]
]
];
```
设置文件/html/plugins/tphp/demo/html/www/base/orm/src.php内容如下
```
<?php
return function ($data) {
// 获取值
dump($data);
// 单独调用,也是很方便的,注意冒号
dump($this->db(':product.detail')->get());
// 等价于
// dump($this->plu->model("product.detail==demo")->db()->get());
// dump($this->plu->model("product.detail==tphp.demo")->db()->get());
// 获取表字段信息
dump($this->plu->model("product.detail")->tableInfo());
return $data;
};
```
打开网址[http://plu.tphp.com/base/orm](http://plu.tphp.com/base/orm)获得如下效果
自动创建表:product

自动创建表:product_detail

- 好了,现在基本可以不用数据库软件开发项目了
- 习惯之后或许应该可能会感觉很愉快的吧
- 一定要自行体会Eloquent ORM的强大