gyde/mysql-object-model

v1.0.8 2024-05-24 09:48 UTC

This package is not auto-updated.

Last update: 2024-09-27 11:22:14 UTC


README

使用MySQL作为后端并通过PDO的PHP对象模型。允许快速生成具有高性能MySQL特定后端的模型。第一个版本已可用,之后将提供有关安装、使用和命名空间更多的信息。已为MOMBase和MOMSimple添加了Memcache和静态缓存。

目录

  1. 版本
  2. 用法
  3. 注意事项
  4. 工具

版本

这个版本被认为是稳定的,并且一旦在php7.3上经过现场测试,它将被标记为版本1.0!

当前使用此项目的项目

  • Solaris - mobilspejd.dk - Scout race navigation system)
  • DOG - roskilde-festival IT deployment tool
  • Intranet - Ordbogen A/S intranet

使用此代码不提供任何担保,但欢迎所有建议和错误报告。

用法

示例表

CREATE TABLE `admin`.`userstest` (
	`user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
	`active` BOOLEAN UNSIGNED NOT NULL DEFAULT TRUE,
	`created` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`user_id`), INDEX (`name`))
	ENGINE = INNODB;

类定义

MOMSimple使用的简单示例

class User extends \namespace\MOMSimple
{
	const DB = 'administration';
	const TABLE = 'users';

	// Primary column name (required)
	const COLUMN_PRIMARY_KEY = 'user_id';

	// Other column names (optional)
	const COLUMN_NAME = 'name';
	const COLUMN_ACTIVE = 'active';
	const COLUMN_CREATED = 'created';
}

您只需定义要用于轻松(常量安全)访问的可选列,对象成员变量将根据数据库表定义通过SQL查找创建。

使用PDO连接SQL

$connection = new \PDO('mysql:host=127.0.0.1', 'myuser', 'mypasswd');

// Sets a global PDO connection for MOMBase to use
\namespace\MOMBase::setConnection($connection, TRUE);

// Sets a specific PDO connection for User to use
User::setConnection($connection);

创建和保存对象

// Create a new object
$object1 = new User();

// Set object properties (all properties are public by default)
$object1->name = 'foo';
$object1->description = 'imfulloffoo';

// Save the object to the database and refetch it (update autoincrements, timestamps and other default values
$object1->save();

通过主键获取对象

// Fetch the object we just created using primary id (assuming user_id is 1)
$object1 = User::getById(1);
if ($object1 instanceOf User)
{
	echo $object1->name;
}

获取对象

所有

// Fetch all User objects
$users = User::getAll();
foreach ($users as $user)
{
	echo $user->name;
}

过滤

使用where子句对多个或单个对象进行过滤的小指南

多个

通过SQL where子句获取一些用户对象

$where = '`'.User::COLUMN_NAME.'` = '.User::escapeStatic('foo');
$someObjects = User::getAllByWhere($where);
foreach ($someObjects as $object)
{
	echo $object->name;

像上述示例这样的功能通常应放在对象类内部,如下所示

class User extends MOMSimple
{
	...
	/**
	  * Fetch users using name
	  * @param string $name
	  * @return array<int user_id, User>
	  */
	public static function getByName($name)
	{
		$where = '`'.self::COLUMN_NAME.'` = '.self::escapeStatic($name);
		return self::getAllByWhere($where, null, true);
	}
	...
}
单个

通过SQL where子句获取单个用户对象

$where = '`'.User::COLUMN_NAME.'` = '.User::escapeStatic('foo');
$order = '`'
$someObjects = User::getOne($where);
foreach ($someObjects as $object)
{
	echo $object->name;
}

修改对象

在获取对象时

您可以通过覆盖默认加载方法来更改对象从数据库获取后的成员变量,您可能想要将所有时间戳和日期时间转换为DateTime对象

class User extends MOMSimple
{
	...
	/**
	  * Fills object
	  * Creates public vars on object with name of row key, and value of row value
	  * Sets object to be old, meaning that its been fetched from database
	  * @param string[] $row \PDO_result->fetch_assoc
	  */
	protected function fill($row)
	{
		parent::fill($row);

		$this->created = DateTime::createFromFormat('Y-m-d H:i:s', $this->created);
	}
	...
}

类/类型

MOMBase.class.php

所有对象模型扩展的通用/工厂类。这包含通用的查询函数并要求扩展类实现所需的方法。

MOMSimple.class.php

用于具有一个主键列的MySQL表的简单scaffolding类

MOMCompound

用于具有多个主键列的MySQL表的复合scaffolding类

注意事项

以下是MOM系统中当前常见提示、技巧和注意事项的列表。

更新/默认值列

如果您创建了一个具有默认“当前时间戳”值或“on update”属性的列的表,请注意此列完全由MOM控制,不能通过在公共类变量上设置值来更新。该列被排除在MOM执行的任何插入或更新语句之外。

测试(PHPUnit)

测试已使用PHPUnit设计,将在docker环境中根据需要创建和删除表。为了运行测试,需要满足以下条件

  • 运行中的docker-ce环境

使用./docker/build_container ./docker/bootstrap_container /absolute/path/to/MySQL-Object-Model/构建docker环境

运行./run_tests以在docker环境中启动测试。./run_tests

build_mom

Shell脚本来“构建”MOM,第一个提供的参数作为命名空间。

./build_mom my\\\\name\\\\space

MOM文件将放置在名为build的文件夹中,其命名空间为my\name\space。需要额外的斜杠,因为shell转义