otter / orm
SQL Server 简单 ORM
dev-master
2020-03-14 20:45 UTC
Requires
- php: ^7.0
This package is auto-updated.
Last update: 2024-09-15 06:20:22 UTC
README
这是一个无依赖项的 PHP for SQL Server 简单 ORM。
安装
...
要求
如何使用
$orm = new \Otter\ORM\Otter('localhost', 'databaseName', 'sa', 'password');
$orm->schemas(__DIR__.'/schemas');
$User = \Otter\ORM\Otter::get('User');
$users = $User->findAll()
->end();
if($users !== null) {
print_r($users); // array of objects
} else {
$info = \Otter\ORM\Otter::lastQueryErrorInfo(); // array
print_r($info);
}
配置
我们需要一个包含数据库模式的文件夹。
$orm->schemas(__DIR__.'/schemas'); // path to configuration files schemas
模式示例( schemas/UserSchema.xml )
<?xml version="1.0" encoding="UTF-8"?>
<schema table="users">
<columns>
<column name="id" type="integer">
<primary-key>TRUE</primary-key>
<allow-null>FALSE</allow-null>
<required>FALSE</required>
</column>
<column name="id_role" type="integer">
<default-value>1</default-value>
</column>
<column name="name" type="string">
<length>100</length>
</column>
<column name="email" type="string">
<length>100</length>
<default-value>email@email.com</default-value>
</column>
<column name="country" type="string">
<allow-null>TRUE</allow-null>
<required>TRUE</required>
</column>
<column name="createdAt" type="datetime">
<allow-null>FALSE</allow-null>
<required>TRUE</required>
<default-value otter="otter.date.now"></default-value>
</column>
<column name="updatedAt" type="datetime">
<allow-null>TRUE</allow-null>
<required>FALSE</required>
</column>
</columns>
<associations/>
</schema>
自动生成模式(终端)
如果你的数据库是自动生成的,你可以使用命令行来生成模式。
示例
> php bin/otter generate:schema:db --host=localhost --db=databaseName --user=sa --password=password123 --path=db/schemas --model=User --table=users
参数
查询
SELECT
简单示例
$users = $User->find()
->end();
$users = $User->findAll()
->end();
find(...)
方法是findAll(...)->top(1)
的别名
过滤结果
这找到所有名为 George 的用户
$User->findAll()
->where([
'name' => 'George',
])
->end();
这找到所有名为 George 或 ID 1 的用户
$User->findAll()
->where([
'name' => 'George',
'or',
'Id' => 1
])
->end();
这找到第一个名为 George 或 Philippe 的用户
use Otter\ORM\OtterValue;
$User->find()
->where([
OtterValue::OR('name', 'George', 'Philippe'),
])
->end();
这找到第一个国家为 EEUU、名字以 Ge 开头且 ID 大于 10 的用户
$User->find()
->where([
'country' => 'EEUU',
'name' => ['LIKE', 'GE%'],
'id' => ['>', 10]
])
->end();
获取前 10 个结果
$User->findAll()
->top(10)
->end();
仅获取 ID 和名字
$User->findAll([
'id',
'name'
])
->end();
排序
$User->findAll([
'id',
'name'
])
->orderBy([
'id', // Ascendent
'name' => 'DESC' // Descendent
])
->end();
分组
$User->findAll([
'country'
])
->groupBy([
'country'
])
->end();
计数数据
$User->count()
->where([
'country' => 'EEUU'
])
->end();
- 这返回一个数字
关系
$User->find()
->include([
'role'
])
->end();
- 连接内部使用依赖于模式的配置。
- 有关更多详细信息,请参阅关系
CREATE
$User->create([
'name' => 'Joe',
'country' => 'France',
]);
- 这返回一个 布尔值
- 不使用 end 函数
- 记住:我们使用配置文件。如果某个列是必需的且未传递,将使用
DefaultValue
或如果允许,将使用 NULL
schemas/UserSchema.php
...
<columns>
...
<column name="email" type="string">
<length>30</length>
<allow-null>FALSE</allow-null>
<required>FALSE</required>
<default-value>email@email.com</default-value> // will be used
</column>
...
</columns>
...
UPDATE
$User->update([
'country' => 'EEUU',
])
->where([
'id' => 1
])
->end();
- 不要忘记
where
函数,如果你不希望更新表中的所有数据。
DELETE
$User->update([
'country' => 'EEUU',
])
->where([
'id' => 1
])
->end();
- 不要忘记
where
函数,如果你不希望删除表中的所有数据。
关系
我们使用 4 种类型的关系
- 属于
- 多对多
- 一对一
- 多对一
属于
这用于 1:1 或 1:1 的关系。例如,一个用户可以有一个或多个角色(取决于设计)。在两种情况下,我们都在用户模式中使用 BelongsTo。
schemas/UserSchema.xml
...
<associations>
...
<association name="role" type="BelongsTo">
<model>Role</model>
<foreign-key>id_role</foreign-key>
<key>id</key>
<strict>TRUE</strict> // optional
</association>
...
</associations>
...
- 关联标签中的
name
属性是关联的名称(我们使用了关联名称来链接关联) strict
选项强制在选择中使用 Inner Join。默认情况下,我们使用 LEFT JOIN
多对多
这用于 N:1 的关系。
schemas/UserSchema.xml
...
<associations>
...
<association name="roles" type="BelongsToMany">
<foreign-key>id_role</foreign-key>
<through>UserRole</through>
<through-bridge>role</through-bridge>
<through-key>id_user</through-key>
</association>
...
</associations>
...
- 关联标签中的
name
属性是关联的名称(我们使用了关联名称来链接关联) strict
选项强制在选择中使用 Inner Join。默认情况下,我们使用 LEFT JOINthrough
标签表示中间模型和必要的选项through-bridge
表示在 UserRole 中使用的关联名称(例如)through-key
表示指向另一个模型的列(例如将 User 关联到 UserRole)
一对一
这用于 1:1 的关系。例如,一本书通常有一个作者。
schemas/BookSchema.xml
...
<associations>
...
<association name="role" type="HasOne">
<model>Author</model>
<foreign-key>id_author</foreign-key>
<key>id</key>
<strict>TRUE</strict> // optional
</association>
...
</associations>
...
- 关联标签中的
name
属性是关联的名称(我们使用了关联名称来链接关联) strict
选项强制在选择中使用 Inner Join。默认情况下,我们使用 LEFT JOIN
多对一
这用于 1:N 的关系。例如,一本书通常有一个作者。
schemas/BookSchema.xml
...
<associations>
...
<association name="role" type="HasMany">
<model>Author</model>
<foreign-key>id_author</foreign-key>
<key>id</key>
<strict>TRUE</strict> // optional
</association>
...
</associations>
...
- 关联标签中的
name
属性是关联的名称(我们使用了关联名称来链接关联) strict
选项强制在选择中使用 Inner Join。默认情况下,我们使用 LEFT JOIN
自由查询
如果您愿意,可以生成查询并执行。
Otter\ORM\Otter::db("SELECT * FROM persons");
- 返回
array|null