Пишем свой ORM на подобии RedBeanPHP

Вступление


Сейчас почти все программисты хотят облегчить себе работу. Создаются фреймворки, ORM'ы и т.п. Сегодня я хочу показать вам как можно за 20-30 минут создать свой ORM на подобии RedBeanPHP. Покажу я только Систему CRUD (Create, Read, Update, Delete).

Подготовка


Для начала нам нужен будет всего лишь два файла это Lyricon.php (вы можете назвать свой ORM как-то по другому, но я напишу так) и index.php он будет являться тестом нашего ORM.

Основная часть


Для начала создадим класс. Я написал L (Lyricon) для упрощения.

<?php
class L{

}

Теперь нам нужно создать переменную connection или связь с базой данных.

class L{
     static private $connection; 
}

Далее создаём функцию, которая будет отвечать за подключение к базе данных. Назовём её setup.

 class L{
     static private $connection; 
     public function setup($host,$db,$login,$pass){
        self::$connection = mysqli_connect($host,$login,$pass,$db);
     }
}

Теперь переменную $connection мы постоянно можем её использовать в функциях. После нужно создать команду Create. Я организую её как в RBPHP с помощью dispense и store. Наша функция должна будет создавать таблицу удобную для пользователя автоматически. Для этого нужно будет поработать со строками. Создадим функцию dispense она будет отвечать за имя таблицы.

    public function dispense($table){
		$arr = array('table' => $table);
		return $arr;
    }

Теперь мы можем в данном массиве создавать другие ячейки. Например:

   $user = L::dispense('users');
   $user['login'] = 'Pegriler';
   $user['pass'] = '132231';

Но мы должны же как-то это залить в базу данных. Для этого я сделал переменные $table и $insert. Для того чтобы сделать таблицу удобную для юзера скопируйте этот код:

public function store($variable){
		$insert = "INSERT INTO `".$variable['table']."`(";
		foreach ($variable as $key => $value) {
			if(trim($key) != 'table'){				
					$insert = $insert.''.$key.',';
			}
		}
		$insert = substr($insert,0,-1);
		$insert = $insert.") VALUES(";
		foreach ($variable as $key => $value) {
			if(trim($key) != 'table'){	
				if(trim(gettype($value)) == 'string'){
						$insert = $insert.'\''.$value.'\',';
					}else{
						$insert = $insert.''.$value.',';
					}
				}
		}
		$insert = substr($insert,0,-1);
		$insert = $insert.')';
		foreach ($variable as $key => $value) {
			if(trim($key) != 'table'){
				if(trim(gettype($value)) == 'string'&&strlen($value) < 512){
					$variable[$key] = $key.' TEXT(512),
';
				}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 512&&strlen($value) <= 1024){
					$variable[$key] = $key.' TEXT(1024),
';
				}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 1024&&strlen($value) <= 2048){
					$variable[$key] = $key.' TEXT(2048),
';
				}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 2048&&strlen($value) <= 4096){
					$variable[$key] = $key.' TEXT(4096),
';
				}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 4096){
					$variable[$key] = $key.' TEXT(65535),
';
				}
				if(gettype($value) == 'integer'){
					$variable[$key] = $key.' INT(128),
';
				}
				if(gettype($value) == 'double'||gettype($value) == 'float'){
					$variable[$key] = $key.' FLOAT(53),
';
				}
			}

		};
				$table = "
CREATE TABLE ".$variable['table']."(
id INT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
";
				foreach ($variable as $key => $value) {
					if(trim($key) != 'table'){
							$table = $table.''.$value;
						
					}

				};
				$table = substr($table,0,-3);
				$table = $table.'
)';
}

Для начала объясню. $insert это переменная, которая будет отвечать за insert в бд mysql. $table за создание таблицы. Теперь всё это можно закрепить с помощью mysqli_query:

$tab = mysqli_query(self::$connection,$table);
$ins = mysqli_query(self::$connection,$insert);

Для проверки можете написать данный код:

$user = L::dispense('users');
$user['login'] = 'Priler';
$user['pass'] = 'Qwerty123';
L::store($user);

С Read всё просто. Напишем функцию read или find:

public function find($table,$condition){
		
		$result = mysqli_query(self::$connection,"SELECT *  FROM  `$table` WHERE  $condition ");
		return mysqli_fetch_assoc($result);
	}

mysqli_fetch_assoc нужен для того чтобы переменную отвечающую за чтение можно было хранить как массив и читать ячейки каким-либо условием например id = 1, name = John и т. д.


Окончание


Я показал как примерно создавать такие ORM если хотите можете сделать оставщееся команды CRUD. И вообще дальше создавать данный ORM.

Теги:
ORM, PHP, Самописная ORM

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Похожие публикации