Model

基础定义

基本模型

定义一个模型基础的模型,必须继承EasySwoole\ORM\AbstractModel

  1. namespace App\Models;
  2. use EasySwoole\ORM\AbstractModel;
  3. /**
  4. * 用户商品模型
  5. * Class UserShop
  6. */
  7. class UserShop extends AbstractModel
  8. {
  9. }

数据表名称

必须在Model中定义 $tableName 属性,指定完整表名,否则将会产生错误Table name is require for model

  1. namespace App\Models;
  2. use EasySwoole\ORM\AbstractModel;
  3. /**
  4. * 用户商品模型
  5. * Class UserShop
  6. */
  7. class UserShop extends AbstractModel
  8. {
  9. /**
  10. * @var string
  11. */
  12. protected $tableName = 'user_shop';
  13. }

定义表结构

自动生成表结构

  1. $model = new User();
  2. $table = $model->schemaInfo();

使用模型中的schemaInfo()方法可以获取当前模型指定数据表的结构返回一个EasySwoole\ORM\Utility\Schema\Table对象

模型本身会自动生成表结构,但每次启动Easyswoole,都会去重新获取一次表结构信息,并且在这次服务中缓存,直到Easyswoole服务停止或者重启 如果不希望每次重启都去请求一次数据库,可自行定义该方法,返回Table对象

自定义表结构

在模型类中,我们实现一个getSchemaInfo方法,要求返回一个EasySwoole\ORM\Utility\Schema\Table实例化对象

  1. use EasySwoole\ORM\Utility\Schema\Table;
  2. use EasySwoole\ORM\AbstractModel;
  3. class User extends AbstractModel
  4. {
  5. protected $tableName = 'user';
  6. /**
  7. * 表的获取
  8. * 此处需要返回一个 EasySwoole\ORM\Utility\Schema\Table
  9. * @return Table
  10. */
  11. public function schemaInfo(bool $isCache = true): Table
  12. {
  13. $table = new Table($this->tableName);
  14. $table->colInt('id')->setIsPrimaryKey(true);
  15. $table->colChar('name', 255);
  16. $table->colInt('age');
  17. return $table;
  18. }
  19. }

表字段

在Table中,有colX系列方法,用于表示表字段的类型,如以上示例的Int,Char

  1. $table->colInt('id');
  2. $table->colChar('name', 255);

表主键

如果需要将某个字段指定为主键 则用连贯操作方式,在后续继续指定即可。

  1. $table->colInt('id')->setIsPrimaryKey(true);

指定连接名

安装 章节,我们已经知道了,在注册配置信息的时候,可以给这份配置指定一个连接名

可以通过模型类自定义属性 connectionName 来指定使用的连接配置,默认为 default

假设已经通过 配置信息注册 章节注册了一个 read 连接名的配置

那么我们可以在Model中定义指定read连接名

  1. Class AdminModel extends \EasySwoole\ORM\AbstractModel
  2. {
  3. protected $connectionName = 'read';
  4. }

可以继续查看 读写分离 章节,进一步查看如何使用不同数据库配置。

时间戳

在ORM组件版本 >= 1.0.18 后,增加自动时间戳特性支持。

用于:自动写入创建和更新的时间字段。

  • 在插入数据的时候,自动设置插入时间为当前,
  • 在更新数据的时候,自动设置更新时间为当前。

使用方式

  1. use \EasySwoole\ORM\AbstractModel ;
  2. Class AdminModel extends AbstractModel
  3. {
  4. // 都是非必选的,默认值看文档下面说明
  5. protected $autoTimeStamp = true;
  6. protected $createTime = 'create_at';
  7. protected $updateTime = 'update_at';
  8. }

autoTimeStamp

是否开启自动时间戳,默认值 false

可选值:

  • true 字段默认为int类型 储存时间戳
  • int 字段为int类型 储存时间戳
  • datetime 字段为datetime类型 Y-m-d H:i:s

createTime

数据创建时间 字段名,默认值 create_time

可选值

  • 任意字符串,对应为表中要储存创建时间的字段名
  • false,不处理创建时间字段

updateTime

数据更新时间 字段名,默认值 update_time

可选值

  • 任意字符串,对应为表中要储存创建时间的字段名
  • false,不处理更新时间字段

字段预定义属性

版本要求:orm >= 1.4.9

利用cast定义可以实现:在取出时自动转换为数组、在存储时自动转换为json字符

数据库储存一般是以文本格式,php擅长的是数组、对象等,达到灵活使用的目的。

也可以定义字段为int、小数、时间戳等

定义方式

  1. class TestCastsModel extends AbstractModel
  2. {
  3. protected $casts = [
  4. 'age' => 'int',
  5. 'id' => 'float',
  6. 'addTime' => 'timestamp',
  7. 'state' => 'bool',
  8. // 在join中自定义的
  9. 'test_json' => 'json',
  10. 'test_array' => 'array',
  11. 'test_date' => 'date',
  12. 'test_datetime' => 'datetime',
  13. 'test_string' => 'string',
  14. ];
  15. }

支持类型

类型设置值
整数int、 integer
浮点real、float、double
字符串string
布尔值bool、boolean
数组array 相当于json_decode($data, true)
对象json、object 相当于json_decode($data)
日期 Y-m-ddate
日期 Y-m-d H:i:sdatetime
时间戳timestamp
自定义日期格式未完成
自定义小数类型未完成

示例代码

以下代码为orm组件的单元测试脚本

  1. public function testFloat()
  2. {
  3. $test = TestCastsModel::create([
  4. 'id' => 1
  5. ]);
  6. $this->assertIsFloat($test->id);
  7. }
  8. public function testInt()
  9. {
  10. $test = TestCastsModel::create([
  11. 'age' => "21"
  12. ]);
  13. $this->assertIsInt($test->age);
  14. }
  15. public function testTimestamp()
  16. {
  17. $test = TestCastsModel::create([
  18. 'addTime' => "2020-6-4 16:45:04"
  19. ]);
  20. $this->assertIsInt($test->addTime);
  21. }
  22. public function testBool()
  23. {
  24. $test = TestCastsModel::create([
  25. 'state' => 0
  26. ]);
  27. $this->assertIsBool($test->state);
  28. }
  29. public function testString()
  30. {
  31. $test = TestCastsModel::create();
  32. $test->setAttr('test_string', 1);
  33. $this->assertIsString($test->test_string);
  34. }
  35. public function testJson()
  36. {
  37. $test = TestCastsModel::create();
  38. $test->setAttr('test_json', [
  39. 'name' => 'siam'
  40. ]);
  41. $this->assertInstanceOf(\stdClass::class, $test->test_json);
  42. }
  43. public function testArray()
  44. {
  45. $test = TestCastsModel::create();
  46. $test->setAttr('test_array', [
  47. 'name' => 'siam'
  48. ]);
  49. $this->assertIsArray($test->test_array);
  50. }
  51. public function testDate()
  52. {
  53. $test = TestCastsModel::create();
  54. $test->setAttr('test_date', time());
  55. $this->assertEquals(date("Y-m-d"), $test->test_date);
  56. }
  57. public function testDateTime()
  58. {
  59. $test = TestCastsModel::create();
  60. $test->setAttr('test_datetime', time());
  61. $this->assertEquals(date("Y-m-d H:i:s"), $test->test_datetime);
  62. }