Reusing Database Queries
Writing Reusable Database Queries
You can wrap your query in the DatabaseQuery
object. Then, it will be possible
to reuse that query in Responders or
GraphQL:
php<?php namespace App\DatabaseQuery; use App\DatabaseEntity\BlogPost; use Distantmagic\Resonance\DatabaseConnectionPoolRepository; use Distantmagic\Resonance\DatabaseQuery; /** * @template-extends DatabaseQuery<null|BlogPost> */ final readonly class SelectBlogPostBySlug extends DatabaseQuery { const SQL = <<<'SQL' SELECT blog_posts.content, blog_posts.slug, blog_posts.title, FROM blog_posts WHERE blog_posts.slug = :slug LIMIT 1 SQL; public function __construct( DatabaseConnectionPoolRepository $databaseConnectionPoolRepository, private string $blogPostSlug, ) { parent::__construct($databaseConnectionPoolRepository); } /** * @return false|array{ * content: string, * slug: string, * title: string, * } */ public function execute(): false|array { $stmt = $this->getConnection()->prepare(self::SQL); $stmt->bindValue('slug', $this->blogPostSlug); $stmt->execute(); return $stmt->fetchAssociative(); } }
Using the query:
php<?php use App\DatabaseQuery\SelectBlogPostBySlug; $selectBlogPostBySlug = new SelectBlogPostBySlug( $databaseConnectionPoolRepository, 'blog-post-slug', ); $blogPost = $selectBlogPostBySlug->execute();
Using Specific Connection Pool
You can choose a specific connection pool to execute the query by using
$this-
. For example:
php<?php namespace App\DatabaseQuery; use Distantmagic\Resonance\DatabaseQuery; use Generator; final readonly class SelectBlogPosts extends DatabaseQuery { const SQL = <<<'SQL' SELECT blog_posts.title FROM blog_posts SQL; public function execute(): false|array { $stmt = $this->getConnection('readonly')->prepare(self::SQL) return $stmt->execute()->fetchAllAssociative(); } }