greg-md/php-orm

PHP 强大的 ORM(对象关系映射)。

dev-master 2019-07-24 08:14 UTC

This package is auto-updated.

Last update: 2024-09-24 19:42:23 UTC


README

StyleCI Build Status Total Downloads Latest Stable Version Latest Unstable Version License

PHP 的一个轻量但强大的 ORM(对象关系映射)库。

开始使用,建立数据库连接,创建数据库表的 活动记录模型,并使用 查询构建器 编写您的第一个查询。

为什么使用 Greg ORM?

您可以在下一篇文章中了解: 待定

开始使用

要求

  • PHP 版本 ^7.1

安装

您可以使用 Composer 将此库作为本地、针对项目的依赖项添加到项目中。

composer require greg-md/php-orm

支持的驱动程序

  • MySQL
  • SQLite

进行中

  • MS SQL
  • PostgreSQL
  • Oracle

数据库连接 - 快速入门

创建数据库连接有两种方式:

  1. 为特定驱动程序实例化数据库连接;
  2. 实例化一个连接管理器以存储多个数据库连接。

连接管理器实现了相同的连接策略。这意味着您可以定义一个连接来模拟它。

在下面的示例中,我们将使用连接管理器来存储不同驱动程序的多个连接。

// Instantiate a Connection Manager
$manager = new \Greg\Orm\Connection\ConnectionManager();

// Register a MySQL connection
$manager->register('mysql_connection', function() {
    return new \Greg\Orm\Connection\MysqlConnection(
        new \Greg\Orm\Connection\Pdo('mysql:dbname=example_db;host=127.0.0.1', 'john', 'doe')
    );
});

// Register a SQLite connection
$manager->register('sqlite_connection', function() {
    return new \Greg\Orm\Connection\SqliteConnection(
        new \Greg\Orm\Connection\Pdo('sqlite:/var/db/example_db.sqlite')
    );
});

// Make the manager to act as "mysql_connection"
$manager->actAs('mysql_connection');

现在您可以与此管理器一起工作

// Fetch a statement from "sqlite_connection"
$manager->connection('sqlite_connection')
    ->select()
    ->from('Table')
    ->fetchAll();

// Fetch a statement from mysql_connection, which is used by default
$manager
    ->select()
    ->from('Table')
    ->fetchAll();

完整文档可以在 这里 找到。

活动记录模型 - 快速入门

活动记录模型表示一个表模式,一个实体或该表的实体集合,与查询构建器集成以加快您的编码过程。

假设您有一个 Users

CREATE TABLE `Users` (
  `Id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `Email` VARCHAR(255) NOT NULL,
  `Password` VARCHAR(32) NOT NULL,
  `SSN` VARCHAR(32) NULL,
  `FirstName` VARCHAR(50) NULL,
  `LastName` VARCHAR(50) NULL,
  `Active` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
  PRIMARY KEY (`Id`),
  UNIQUE (`Email`),
  UNIQUE (`SSN`),
  KEY (`Password`),
  KEY (`FirstName`),
  KEY (`LastName`),
  KEY (`Active`)
);

让我们为该表创建模型并配置它

class UsersModel extends \Greg\Orm\Model
{
    // Define table alias. (optional)
    protected $alias = 'u';

    // Cast columns. (optional)
    protected $casts = [
        'Active' => 'boolean',
    ];

    // Table name (required)
    public function name(): string
    {
        return 'Users';
    }

    // Create abstract attribute "FullName". (optional)
    public function getFullNameAttribute(): string
    {
        return implode(' ', array_filter([$this['FirstName'], $this['LastName']]));
    }

    // Change "SSN" attribute. (optional)
    public function getSSNAttribute(): string
    {
        // Display only last 3 digits of the SSN.
        return str_repeat('*', 6) . substr($this['SSN'], -3, 3);
    }

    // Extend SQL Builder. (optional)
    public function whereIsNoFullName()
    {
        $this->whereIsNull('FirstName')->whereIsNull('LastName');

        return $this;
    }
}

现在,让我们实例化该模型。您需要的只是一次 数据库连接

// Initialize the model.
$usersModel = new UsersModel($connection);

与表模式一起工作

// Display table name.
print_r($usersModel->name()); // result: Users

// Display auto-increment column.
print_r($usersModel->autoIncrement()); // result: Id

// Display primary keys.
print_r($usersModel->primary()); // result: ['Id']

// Display all unique keys.
print_r($usersModel->unique()); // result: [['Email'], ['SSN']]

处理单行

// Create a user.
$user = $usersModel->create([
    'Email' => 'john@doe.com',
    'Password' => password_hash('secret'),
    'SSN' => '123456789',
    'FirstName' => 'John',
    'LastName' => 'Doe',
]);

// Display user email.
print_r($user['Email']); // result: john@doe.com

// Display user full name.
print_r($user['FullName']); // result: John Doe

print_r($user['SSN']); // result: ******789

// Display if user is active.
print_r($user['Active']); // result: true

// Display user's primary keys.
print_r($user->getPrimary()); // result: ['Id' => 1]

处理行集

// Create some users.
$usersModel->create([
   'Email' => 'john@doe.com',
   'Password' => password_hash('secret'),
   'Active' => true,
]);

$usersModel->create([
   'Email' => 'matt@damon.com',
   'Password' => password_hash('secret'),
   'Active' => false,
]);

$usersModel->create([
   'Email' => 'josh@barro.com',
   'Password' => password_hash('secret'),
   'Active' => false,
]);

// Fetch all inactive users from database.
$inactiveUsers = $usersModel->whereIsNot('Active')->fetchAll();

// Display users count.
print_r($inactiveUsers->count()); // result: 2

// Display users emails.
print_r($inactiveUsers->get('Email')); // result: ['matt@damon.com', 'josh@barro.com']

// Activate all users in the row set.
$inactiveUsers->set('Active', true)->save();

print_r($inactiveUsers[0]['Active']); // result: true
print_r($inactiveUsers[1]['Active']); // result: true

与查询构建器一起工作

选择没有姓名和姓氏的用户。

$users = $usersModel
    ->whereIsNoFullName()
    ->orderAsc('Id')
    ->fetchAll();

更新用户

$usersModel
    ->where('Id', 10)
    ->update(['Email' => 'foo@bar.com']);

完整文档可以在 这里 找到。

查询构建器 - 快速入门

查询构建器以优雅的方式在不同复杂级别上创建 SQL 语句和子句。

您可以使用 数据库连接 轻易地实例化一个查询构建器。

假设您有一个 Students 表。

找到住在基什尼奥夫并在 1990 年出生的学生姓名

$students = $connection->select()
    ->columns('Id', 'Name')
    ->from('Students')
    ->where('City', 'Chisinau')
    ->whereYear('Birthday', 1990)
    ->fetchAll();

更新学生的成绩

$connection->update()
    ->table('Students')
    ->set('Grade', 1400)
    ->where('Id', 10)
    ->execute();

删除当年未录取的学生

$connection->delete()
    ->from('Students')
    ->whereIsNot('Admitted')
    ->execute();

添加新学生

$query = $connection->insert()
    ->into('Students')
    ->data(['Name' => 'John Doe', 'Year' => 2017])
    ->execute();

完整文档可以在 这里 找到。

文档

许可证

麻省理工学院 © 格里戈里·杜卡

巨长引用

I fear not the man who has practiced 10,000 programming languages once, but I fear the man who has practiced one programming language 10,000 times. © #horrorsquad