butschster/cycle-orm

Cycle ORM 对 Laravel 框架的集成

v0.6 2021-08-07 19:05 UTC

This package is auto-updated.

Last update: 2024-09-08 02:01:10 UTC


README

laracycle

Latest Stable Version Total Downloads License

Cycle 是一个 PHP 数据映射 ORM 和数据建模引擎,旨在在经典和守护进程化的 PHP 应用程序(如 RoadRunner)中安全工作。该 ORM 提供了灵活的配置选项来建模数据集,一个强大的查询构建器,并支持动态映射模式。该引擎可以与纯 PHP 对象一起工作,支持注解声明,并通过扩展进行代理。

完整信息 - https://cycle-orm.dev/docs

要求

  • Laravel 7.x
  • PHP 7.4 及以上

安装和配置

在命令行运行

composer require butschster/cycle-orm

可选地,您可以注册 EntityManager、Transaction 和/或 ORM 门面

'DatabaseManager' => Butschster\Cycle\Facades\DatabaseManager::class,
'Transaction' => Butschster\Cycle\Facades\Transaction::class,
'ORM' => Butschster\Cycle\Facades\ORM::class,
'EntityManager' => Butschster\Cycle\Facades\EntityManager::class,

环境变量

DB_CONNECTION=postgres
DB_HOST=127.0.0.1
DB_PORT= # Default port 5432
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=

DB_MIGRATIONS_TABLE=migrations # Migrations table name

DB_SCHEMA_SYNC=false # Sync DB schema without migrations
DB_SCHEMA_CACHE=true # Cache DB schema
DB_SCHEMA_CACHE_DRIVER=file # DB schema cache driver

配置

发布配置文件。

php artisan vendor:publish --provider="Butschster\Cycle\Providers\LaravelServiceProvider" --tag=config

配置数据库

可用的连接和数据库名单可以在 config/cycle.phpdatabase 部分列出。更多信息请参阅 https://cycle-orm.dev/docs/basic-connect#configure-databases

获取数据库管理器 ($dbal)

DatabaseManager 作为单例容器注册

$dbal = $this->app->get(\Spiral\Database\DatabaseManager::class);
// Or
$dbal = $this->app->get(\Spiral\Database\DatabaseProviderInterface::class);

就是这样!

控制台命令

php artisan cycle:migrate

从目录中运行 cycle orm 迁移。

php artisan cycle:refresh

刷新数据库模式。

用法

默认情况下,类定位器在 app 文件夹中查找实体。您可以在 config/cycle.php 配置文件中指定位置。

...
'directories' => [
    app_path(),
],
...

实体管理器

EntityManager 是访问 ORM 功能的中心入口点。它可以用来查找、持久化和删除实体。

使用 EntityManager

您可以使用门面、容器或依赖注入来访问 EntityManager 方法

EntityManager::persist($entity);

// Or

app(\Butschster\Cycle\Contracts\EntityManager::class)->persist($entity);

// Or

use Butschster\Cycle\Contracts\EntityManager;

class ExampleController extends Controller
{
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
}

查找实体

实体是具有身份的对象。它们的身份在您的领域中有概念意义。在 CMS 应用程序中,每篇文章都有一个唯一的 id。您可以通过该 id 唯一标识每篇文章。

$article = EntityManager::findByPK('App\Article', 1);
$article->setTitle('Different title');

$article2 = EntityManager::findByPK('App\Article', 1);

if ($article === $article2) {
    echo "Yes we are the same!";
}

持久化

通过通过 EntityManager 的 persist 方法传递实体,该实体变为 MANAGED,这意味着从现在起其持久性将由 EntityManager 管理。

$article = new Article;
$article->setTitle('Let\'s learn about persisting');

EntityManager::persist($article);

删除

通过传递实体到 delete($entity) 方法,可以从持久存储中删除实体。

EntityManager::delete($article);

示例

User

<?php
namespace App;

use Illuminate\Contracts\Auth\Authenticatable;

/**
 * @ORM\Entity(
 *     table="users",
 *     repository="App\UserRepository",
 * )
 */
class User implements Authenticatable
{
    /** @ORM\Column(type="uuid", primary=true) */
    protected string $id;

    /** @ORM\Column(type="string") */
    protected string $password;

    /** @ORM\Column(type="string") */
    protected string $rememberToken = '';

    public function getId(): string
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getAuthIdentifierName(): string
    {
        return 'id';
    }

    /**
     * @return string
     */
    public function getAuthIdentifier(): string
    {
        return $this->getId();
    }

    /**
     * @return string
     */
    public function getAuthPassword(): string
    {
        return $this->password;
    }

    /**
     * @param string $password
     */
    public function setAuthPassword(string $password): void
    {
        $this->password = $password;
    }

    /**
     * @return string
     */
    public function getRememberToken(): string
    {
        return $this->rememberToken;
    }

    /**
     * @param string $value
     */
    public function setRememberToken($value): void
    {
        $this->rememberToken = $value;
    }

    /**
     * @return string
     */
    public function getRememberTokenName(): string
    {
        return 'rememberToken';
    }
}

存储库

namespace App;

use Butschster\Cycle\Repository;

class UserRepository extends Repository
{
    /** @inheritDoc */
    public function findByUsername(string $username): ?User
    {
        return $this->findOne(['username' => $username]);
    }
}

创建用户

use Cycle\ORM\ORMInterface;
use Butschster\Cycle\Facades\ORM;
use Butschster\Cycle\Facades\EntityManager;

$user = new User();

$repository = app(ORMInterface::class)->getRepository($user);
// or
$repository = ORM::getRepository($user);
// or
$repository = ORM::getRepository(User::class);

$repository->persist($user);

// or

EntityManager::persist($user);

更新用户

use Butschster\Cycle\Facades\ORM;
use Butschster\Cycle\Facades\EntityManager;

$repository = ORM::getRepository(User::class);
$user = $repository->findByPK('5c9e177b0a975a6eeccf5960');
$user->setAuthPassword('secret');

$repository->persist($user);

// or

EntityManager::persist($user);

删除用户

use Butschster\Cycle\Facades\ORM;
use Butschster\Cycle\Facades\EntityManager;

$repository = ORM::getRepository(User::class);
$user = $repository->findByPK('5c9e177b0a975a6eeccf5960');

$repository->delete($user);

// or

EntityManager::delete($user);