otter/orm

SQL Server 简单 ORM

dev-master 2020-03-14 20:45 UTC

This package is auto-updated.

Last update: 2024-09-15 06:20:22 UTC


README

这是一个无依赖项的 PHP for SQL Server 简单 ORM。

安装

...

要求

下载并配置 PDO_SQLSRV

如何使用

$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();

这找到第一个名为 GeorgePhilippe 的用户

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 JOIN
  • through 标签表示中间模型和必要的选项
    • 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