This commit is contained in:
Michał Sieciechowicz 2021-02-28 00:04:16 +01:00
parent 64c3c3f44b
commit c91ccb9480
10 changed files with 164 additions and 0 deletions

22
app/Model/JobModel.php Normal file
View File

@ -0,0 +1,22 @@
<?php
namespace App\Model;
use App\Query\IJobQuery;
use App\Query\JobQuery;
use Fufle\ORM\Model as BaseModel;
class JobModel extends BaseModel {
//private string $table = 'jobs';
protected static IJobQuery $query;
public int $id;
public float $budget;
public static function Initialize() {
if (self::$query === null) {
self::$query = new JobQuery($this);
}
}
public static function GetLast10() {
return self::QueryAll(self::$query->GetLast10());
}
}

9
app/Query/IJobQuery.php Normal file
View File

@ -0,0 +1,9 @@
<?php
namespace App\Query;
use Fufle\ORM\IQuery as IBaseQuery;
interface IJobQuery extends IBaseQuery {
public function GetLast10(): string;
}

12
app/Query/JobQuery.php Normal file
View File

@ -0,0 +1,12 @@
<?php
namespace App\Query;
use App\Query\IJobQuery;
use Fufle\ORM\Query as BaseQuery;
class JobQuery extends BaseQuery implements IJobQuery {
public function GetLast10() {
return "select * from jobs order by id desc limit 10";
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Fufle\Database;
use PDO;
class ConnectionManager {
private static $connection;
public static function connect(string $connectionString) {
self::$connection = new PDO($connectionString);
}
public static function Query(string $query, array|object $params = [], string $output = 'stdObject') {
$stmt = self::$connection->prepare($query);
$stmt->execute($params);
$stmt->setFetchMode(PDO::FETCH_CLASS, $output);
return $stmt->fetch();
}
public static function QueryAll(string $query, array|object $params = [], string $output = 'stdObject') {
$stmt = self::$connection->prepare($query);
$stmt->execute($params);
$stmt->setFetchMode(PDO::FETCH_CLASS, $output);
return $stmt->fetchAll();
}
}

10
src/Fufle/ORM/IQuery.php Normal file
View File

@ -0,0 +1,10 @@
<?php
namespace Fufle\ORM;
interface IQuery {
public function Get(): string;
//public function Insert(): string;
//public function Update(): string;
public function Delete(): string;
}

48
src/Fufle/ORM/Model.php Normal file
View File

@ -0,0 +1,48 @@
<?php
namespace Fufle\ORM;
use Fufle\Database\ConnectionManager;
abstract class Model {
protected static string $primaryKey = 'id';
protected static ?string $table = null;
protected static ?IQuery $query = null;
public function getTableName() {
return static::$table;
}
public function getPrimaryKey() {
return static::$primaryKey;
}
public static function Get(int $id) {
return self::Query(
static::$query->Get(),
[$id]);
}
protected static function Query($sql, $params) {
self::Initialize();
return ConnectionManager::Query(
$sql,
$params,
get_called_class());
}
protected static function QueryAll($sql, $params) {
self::Initialize();
return ConnectionManager::QueryAll(
$sql,
$params,
get_called_class());
}
abstract public static function Initialize() {
if (static::$table === null) {
static::$table = basename(get_called_class()) . 's';
}
static::Initialize();
}
}

20
src/Fufle/ORM/Query.php Normal file
View File

@ -0,0 +1,20 @@
<?php
namespace Fufle\ORM;
class Query {
private string $table;
private string $primaryKey;
public function __construct(Model $model) {
$this->table = $model->getTableName();
$this->primaryKey = $model->getPrimaryKey();
}
public function Get(): string {
return 'SELECT * FROM '.$this->table.' WHERE '.$this->primaryKey.' = ?';
}
//public function Insert(): string;
//public function Update(): string;
public function Delete(): string {
return 'DELETE FROM '.$this->table.' WHERE '.$this->primaryKey.' = ?';
}
}

16
tests/ModelTests.php Normal file
View File

@ -0,0 +1,16 @@
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Fufle\Database;
echo SayHello::world();
$dns = 'pgsql:host=localhost;port=5432;dbname=dynamic_dev;user=test;password=pass123';
ConnectionManager::Connect($dns);
echo "
";
var_dump(Job::Get(10));
echo "
";