Pull to refresh

Пишем свой 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.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.