好复杂...
- PHP >= 7
- fastd/generator >= 1.0.0
- fastd/pagination >= 1.0.0
{
"require": {
"fastd/database": "~2.0.0"
}
}
不开玩笑, 我觉得我真实太能折腾了, 明明有好用现成的, 还要自己操心.
数据表生成及操作对象映射结构如下:
+------------+ +---------------+
| | | |
| Tables |<-------->| SchemaBuilder |--------------+
| | | | v
+------------+ +---------------+ +-------------+ +--------------+
| | | |
| Schema |-+------->| SchemaCache |
| | | | |
+-----------+ +----------------+ +-------------+ | +--------------+
| | | | ^ |
| DB |<-------->| SchemaParser |--------------+ |
| | | | |
+-----------+ +----------------+ |
|
|
|
|
v
+--------------+
| |
| SchemaReflex |
| |
+--------------+
$fdb = new Fdb([
"read" => [
'database_host' => '{host}',
'database_port' => '{port}',
'database_name' => '{dbname}',
'database_user' => '{user}',
'database_pwd' => '{pwd}'
],
"write" => [
'database_host' => '{host}',
'database_port' => '{port}',
'database_name' => '{dbname}',
'database_user' => '{user}',
'database_pwd' => '{pwd}'
],
]);
即使在配置一个数据库链接的时候,都应该使用二维数组的形式进行配置注入.
获取驱动后可以进行最基础的操作, 因为驱动只是在 PDO 上封装了一层, 具体处理和 PDO 并无差别.
use FastD\Database\Query\MySQLQueryBuilder;
$queryBuilder = new MySQLQueryBuilder();
echo $queryBuilder->from('test'); // SELECT * FROM `test`;
echo $queryBuilder->select(['name'])->from('test'); // SELECT `name` FROM `test`
echo $queryBuilder->select(['name'])->from('test')->where(['name' => 'jan']); // SELECT `name` FROM `test` WHERE `name` = 'jan';
查询构建器仅限用于简单查询,不提供复杂的查询
$fdb->getDriver('read'); // return DriverInterface.
模型的概念和普通框架的保持一致,可以手动新建。
class DemoModel extends Model
{
const TABLE = 'base';
}
手动创建的模型需要指定表名。
可以通过 Reflex
进行映射。使用映射前,需要满足一下其中一个条件。
- 已有数据库是否存在数据表
- 是否有构建数据schema。
use FastD\Database\Schema\SchemaParser;
$schemaDriver = new SchemaParser($driver);
$schemaDriver->getSchemaReflex()->reflex(
__DIR__ . '/Reflex/' . $driver->getDbName(),
'Test\\' . $driver->getDbName()
);
映射后会生成所有的实体对象,模型对象,因此会更加方便使用各个对象。
use FastD\Database\Schema\SchemaBuilder;
$builder = new SchemaBuilder();
$testTable = new Table('test');
$builder->addTable($testTable);
$builder->getSchemaReflex()->reflex(
__DIR__ . '/Reflex',
'Test\\'
);
通过构建数据表 Schema 生成对象。使用方法和映射表一样,快速生成和构建实例对象。
实体需要通过映射生成,手动创建也可,但工序复杂。
实体均继承 \FastD\Database\ORM\Entity
。
理解: 没个实体相当于对应一行具体的记录数, 通过 getter/setter 对其数据进行或去, 通过 toJson
, toArray
, toSerialize
方法对其进行结果集处理。
而且实体对象实现 \ArrayAccess
对象, 所以在使用上和数组操作没有区别。
$entity = new BaseEntity(DriverInterface, ['id' => 1]);
$entity->getName(); // joe
$entity->toArray(); // json_encode([], JSON_NUMERIC_CHECK);
以上操作原理上仅是执行了一个简单的数据库 key/value 查询操作,并且其本身没有过多关系和复杂的设计,因此可以保证在速度上不会有太大的损耗。
填充对象需要实现 FastD\Database\Fixtures\FixtureInterface
抽象接口,对应实现方法。
namespace FastD\Database\Tests\Fixtures;
use FastD\Database\Fixtures\FixtureInterface;
use FastD\Database\Drivers\DriverInterface;
use FastD\Database\Schema\Structure\Field;
use FastD\Database\Schema\Structure\Table;
use Test\Rename\Dbunit\Entities\BaseEntity;
class DemoFixture implements FixtureInterface
{
/**
* Create schema
*
* @return Table
*/
public function loadSchema()
{
$table = new Table('demo');
$table->addField(new Field('id', Field::INT, 10));
$table->addField(new Field('name', Field::VARCHAR, 20));
$table->addField(new Field('nickname', Field::VARCHAR, 30));
$table->addField(new Field('bir', Field::INT, 10));
$table->alterField('nickname', new Field('nickname', Field::CHAR, 30));
$table->dropField('bir');
return $table;
}
/**
* Fill DB data.
*
* @param DriverInterface $driverInterface
* @return mixed
*/
public function loadDataSet(DriverInterface $driverInterface)
{
$baseEntity = new BaseEntity($driverInterface);
$baseEntity->setContent('test');
$baseEntity->save();
}
}
整个 fixture
对象需要先执行 loadSchema
方法,生成对应的实体对象, 才执行 loadDataSet
方法,对其进行数据填充。
望大家多多指点啦.