PHP code example of migears / dao

1. Go to this page and download the library: Download migears/dao library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

migears / dao example snippets


// Plain DAO — pdo + logger
class PlainUserDao
{
    use SingleTableDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger)
    {
        $this->initDao($pdo, $logger);
    }
}

// Cacheable DAO — pdo + logger + cache
class CachedUserDao
{
    use CachedDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger, CacheInterface $cache)
    {
        $this->initDao($pdo, $logger);
        $this->initCachedDao($cache, $logger);
    }
}

use MiGears\Dao\SingleTableDao;
use MiGears\Domain\DataAccess;

class UserDomain
{
    use DataAccess;

    public function __construct(
        public readonly int $id,
        public readonly string $user_name,
        public readonly string $email,
    ) {}
}

class UserDao
{
    use SingleTableDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger)
    {
        $this->initDao($pdo, $logger);
    }
}

$dao = new UserDao($pdo, $logger);

// Read
$user  = $dao->getById(1);                    // UserDomain|null
$user  = $dao->getByIdOrFail(1);              // UserDomain (throws if not found)
$users = $dao->getByIds([1, 2, 3]);           // [id => UserDomain]
$all   = $dao->getAll();                       // UserDomain[] (id DESC)
$count = $dao->count();                        // int

// Write
$id = $dao->insert(['user_name' => 'Alice', 'email' => '[email protected]']);  // last insert id (string)
$n = $dao->update(['id' => 1, 'user_name' => 'Bob']);                  // affected rows
$n = $dao->delete(1);                                                  // affected rows

class UserDao
{
    use SingleTableDao;
    use OffsetPagination;

    protected function table(): string { return 'users'; }
    protected function idColumn(): string { return 'id'; }
    protected function domainClass(): string { return UserDomain::class; }
}

$page = $dao->paginate(2, 20);   // runs one COUNT(*) for the total

$page->items();       // UserDomain[] on the current page
$page->total();       // int — rows across all pages
$page->totalPages();  // int
$page->hasNext();     // bool

class UserDao
{
    use SingleTableDao;
    use CursorPagination;

    protected function table(): string { return 'users'; }
    protected function idColumn(): string { return 'id'; }
    protected function domainClass(): string { return UserDomain::class; }
}

$page = $dao->paginateAfter(null, 20);                 // first page
$page->items();                                        // UserDomain[]
$page->hasMore();                                      // bool
$page = $dao->paginateAfter($page->nextCursor(), 20);  // next page

// Entity reads already return a Domain — no manual fromArray() step
$user = $dao->getByIdOrFail(1);
echo $user->user_name;  // "Alice"

// save() takes a Domain and returns the persisted Domain (insert or update)
$user = $dao->save($userDomain);

// patch() writes only the named columns of a Domain that already holds the new
// values; every other column — including one changed concurrently — is untouched
$dao->patch($userDomain, ['user_name']);

  // save() sees a non-empty key and updates nothing; insert() is the one path
  // that persists a caller-assigned key.
  $dao->insert(['uuid' => $uuid, 'user_name' => 'Alice']);
  

// The Domain already holds the new values (built by whatever flow produced it).
$affected = $dao->patch($user, ['user_name', 'email']);

// UPDATE `users` SET `user_name` = :set_user_name, `email` = :set_email WHERE `id` = …
// Only the named columns reach the SET clause: age, status and created_at keep
// whatever the row holds — even if another writer changed them after your read.

$affected;  // 1 — rows changed (0 when the row no longer exists)

$user  = $cachedDao->getById(1);          // ?UserDomain (cached)
$user  = $cachedDao->getByIdOrFail(1);    // UserDomain (throws if not found)
$users = $cachedDao->getByIds([1, 2]);    // [id => UserDomain] (cached)
$user  = $cachedDao->save($userDomain);   // Domain in, persisted Domain out
$all   = $cachedDao->getAll();            // UserDomain[]

class UserDao
{
    use CachedDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger, CacheInterface $cache)
    {
        $this->initDao($pdo, $logger);
        $this->initCachedDao($cache, $logger);
    }

    protected function deleteCacheFor(?object $user): void
    {
        if ($user !== null) {
            $this->cache->delete('user_by_email_' . $user->email);
        }
    }
}

class PostDao
{
    use SingleTableDao;

    protected function table(): string { return 'posts'; }

    protected function idColumn(): string { return 'post_id'; }

    protected function domainClass(): string { return PostDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger)
    {
        $this->initDao($pdo, $logger);
    }
}

$rows = $dao->sql()
    ->select(['u.user_name', 'p.title'])
    ->from('users u')
    ->where('u.id = p.user_id', [])
    ->execute();

// 普通 DAO — pdo + logger
class PlainUserDao
{
    use SingleTableDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger)
    {
        $this->initDao($pdo, $logger);
    }
}

// Cacheable DAO — pdo + logger + cache
class CachedUserDao
{
    use CachedDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger, CacheInterface $cache)
    {
        $this->initDao($pdo, $logger);
        $this->initCachedDao($cache, $logger);
    }
}

use MiGears\Dao\SingleTableDao;
use MiGears\Domain\DataAccess;

class UserDomain
{
    use DataAccess;

    public function __construct(
        public readonly int $id,
        public readonly string $user_name,
        public readonly string $email,
    ) {}
}

class UserDao
{
    use SingleTableDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger)
    {
        $this->initDao($pdo, $logger);
    }
}

$dao = new UserDao($pdo, $logger);

// 读
$user  = $dao->getById(1);                    // UserDomain|null
$user  = $dao->getByIdOrFail(1);              // UserDomain(找不到抛异常)
$users = $dao->getByIds([1, 2, 3]);           // [id => UserDomain]
$all   = $dao->getAll();                       // UserDomain[](按 id 降序)
$count = $dao->count();                        // int

// 写
$id = $dao->insert(['user_name' => 'Alice', 'email' => '[email protected]']);  // 自增 ID(string)
$n = $dao->update(['id' => 1, 'user_name' => 'Bob']);                  // 影响行数
$n = $dao->delete(1);                                                  // 影响行数

class UserDao
{
    use SingleTableDao;
    use OffsetPagination;

    protected function table(): string { return 'users'; }
    protected function idColumn(): string { return 'id'; }
    protected function domainClass(): string { return UserDomain::class; }
}

$page = $dao->paginate(2, 20);   // 为总数执行一次 COUNT(*)

$page->items();       // 当前页的 UserDomain[]
$page->total();       // int —— 全部页的总行数
$page->totalPages();  // int
$page->hasNext();     // bool

class UserDao
{
    use SingleTableDao;
    use CursorPagination;

    protected function table(): string { return 'users'; }
    protected function idColumn(): string { return 'id'; }
    protected function domainClass(): string { return UserDomain::class; }
}

$page = $dao->paginateAfter(null, 20);                 // 首页
$page->items();                                        // UserDomain[]
$page->hasMore();                                      // bool
$page = $dao->paginateAfter($page->nextCursor(), 20);  // 下一页

// 实体读直接返回 Domain —— 无需手动 fromArray()
$user = $dao->getByIdOrFail(1);
echo $user->user_name;  // "Alice"

// save() 收 Domain、返落库后的 Domain(插入或更新)
$user = $dao->save($userDomain);

// patch() 只写「已带新值的 Domain」中点名的列;其余列(含被并发修改的列)保持不动
$dao->patch($userDomain, ['user_name']);

  // save() 见到非空主键会走 update,结果什么都不插入;insert() 是唯一能持久化
  // 调用方指定主键的路径。
  $dao->insert(['uuid' => $uuid, 'user_name' => 'Alice']);
  

// Domain 已带着新值(由你的流程以任意方式产出)。
$affected = $dao->patch($user, ['user_name', 'email']);

// UPDATE `users` SET `user_name` = :set_user_name, `email` = :set_email WHERE `id` = …
// 只有点名的列进入 SET:age、status、created_at 保持行内现值——即使在你读取之后
// 已被其他写入方改动。

$affected;  // 1 —— 影响行数(行已不存在时为 0)

$user  = $cachedDao->getById(1);          // ?UserDomain(走缓存)
$user  = $cachedDao->getByIdOrFail(1);    // UserDomain(找不到抛异常)
$users = $cachedDao->getByIds([1, 2]);    // [id => UserDomain](走缓存)
$user  = $cachedDao->save($userDomain);   // 收 Domain,返落库后的 Domain
$all   = $cachedDao->getAll();            // UserDomain[]

class UserDao
{
    use CachedDao;

    protected function table(): string { return 'users'; }

    protected function idColumn(): string { return 'id'; }

    protected function domainClass(): string { return UserDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger, CacheInterface $cache)
    {
        $this->initDao($pdo, $logger);
        $this->initCachedDao($cache, $logger);
    }

    protected function deleteCacheFor(?object $user): void
    {
        if ($user !== null) {
            $this->cache->delete('user_by_email_' . $user->email);
        }
    }
}

class PostDao
{
    use SingleTableDao;

    protected function table(): string { return 'posts'; }

    protected function idColumn(): string { return 'post_id'; }

    protected function domainClass(): string { return PostDomain::class; }

    public function __construct(PDO $pdo, LoggerInterface $logger)
    {
        $this->initDao($pdo, $logger);
    }
}

$rows = $dao->sql()
    ->select(['u.user_name', 'p.title'])
    ->from('users u')
    ->where('u.id = p.user_id', [])
    ->execute();