рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рдХреЛрд╣рдирд╛ ORM рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛

рдУрдЖрд░рдПрдо рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рди рдХреЗрд╡рд▓ рдЗрд╖реНрдЯрддрдо, рдмрд▓реНрдХрд┐ рд╢рд╛рдирджрд╛рд░ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, ORM рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЬреЛ рдЕрд╡рд╛рдВрдЫрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛


ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, SHOW FULL COLUMNS FROM `tablename` рдХреНрд╡реЗрд░реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд $ _table_columns рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдлрд╝реАрд▓реНрдб рдбреЗрдЯрд╛ рдХреА рдПрдХ рд╕рд░рдгреА рд╕реЗ рднрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
protected _table_columns => array(8) ( "id" => array(4) ( "type" => string(3) "int" "is_nullable" => bool FALSE ) "email" => array(4) ( "type" => string(6) "string" "is_nullable" => bool FALSE ) ... 


рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдВрддрд┐рдо рдХреНрд╡реЗрд░реА рджрд┐рдЦрд╛рддрд╛ рд╣реИ (рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп)
рдЫрд╡рд┐

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, ORM :: factory () рд╣рд░ рдмрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
 ORM::factory('model_name')->method_1() ORM::factory('model_name')->method_2() 

рдХреНрд╡реЗрд░реА рд╕реЗ 2 рд╕рдорд╛рди рд╢реЛ рдкреВрд░реНрдг рд░рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА $ _table_columns рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ)ред рд╕рд╛рде рд╣реА рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ - ORM :: factory ('user') -> with (('profile') -> with ('photo') ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╣рд░ рджреВрд╕рд░реА рдХреНрд╡реЗрд░реА (рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдУрдЖрд░рдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП) рдмрд╛рд╣рд░ рдЖрддреА рд╣реИ - рдХрдо рд╕реЗ рдХрдо рдкреВрд░реНрдг рдЖрдХреГрддрд┐ ред

рдПрдХ рдЙрдкрд╛рдп


рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдФрд░ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рд╣реИ - рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдореЗрдВ рдЗрд╕ рд╕рд░рдгреА рдХреЛ рднрд░реЗрдВ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдВрдд рдореЗрдВ)ред рджрд░реНрдЬрдиреЛрдВ рдмрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкреИрд░ рдореЗрдВ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ - рдПрдХ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, ORM рд░рд┐рдХреЙрд░реНрдб рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд $ _table_columns рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ ORM :: рдлрд╝реИрдХреНрдЯрд░реА ('рдореЙрдбрд▓') рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - > list_columns () рдФрд░ рдереЛрдбрд╝рд╛ "рдореВрд▓" рд╡рд┐рдзрд┐ рдбреАрдмрдЧ :: vars ();
рд╡рд░реНрдЧ рдХрд╛ рдХреЛрдб рд╣реА рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд╣реИ

рджреЗрдЦреЛ рд╡рд░реНрдЧ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди
 class Optimize{ private static $files = array(); /** * Returns database tables columns list * * @uses find_models() * @uses _dump_simple() */ public static function list_columns() { $dir = APPPATH . "classes/model"; self::find_models($dir); foreach (self::$files as $model) { $file_text = file_get_contents($model); if(preg_match('/extends +ORM/i', $file_text) && !preg_match('/_table_columns/i', $file_text)){ preg_match("/(class\sModel_)(\w+)?(\sextends)/", $file_text, $match); $model_name = preg_replace("/(class\sModel_)(.*?)(\sextends)/", "$2", $match[0]); echo '<h3>Model_'.ucfirst($model_name).'</h3>'; $columns[] = ORM::factory(strtolower($model_name))->list_columns(); $output = array(); foreach ($columns as $var) { $output[] = self::_dump_simple($var, 1024); } echo '<pre>protected $_table_columns = ' . substr(implode("\n", $output), 0, -1) . ';</pre>'; echo '========================================================'; } } } public static function find_models($in_dir) { if (preg_match("/_vti[.]*/i", $in_dir)) { return; } if ($dir_handle = @opendir($in_dir)) { while ($file = readdir($dir_handle)) { $path = $in_dir . "/" . $file; if ($file != ".." && $file != "." && is_dir($path) && $file != '.svn') { self::find_models($path); } if (is_file($path) && $file != ".." && $file != "." && strtolower(substr(strrchr($path, '.'), 1))=='php') { self::$files[] = $path; } } } } protected static function _dump_simple(& $var, $length = 128, $limit = 10, $level = 0) { if ($var === NULL) { return 'NULL,'; } elseif (is_bool($var)) { return ($var ? 'TRUE' : 'FALSE') . ','; } elseif (is_float($var)) { return $var . ','; } elseif (is_string($var)) { return "'" . $var . "',"; } elseif (is_array($var)) { $output = array(); $space = str_repeat($s = ' ', $level); static $marker; if ($marker === NULL) { $marker = uniqid("\x00"); } if ($level < $limit) { $output[] = "array("; $var[$marker] = TRUE; foreach ($var as $key => & $val) { if ($level == 1 && !in_array($key, array('type', 'is_nullable'))) continue; if ($key === $marker) continue; if (!is_int($key)) { $key = "'" . htmlspecialchars($key, ENT_NOQUOTES, Kohana::$charset) . "'"; } $output[] = "$space$s$key => " . self::_dump_simple($val, $length, $limit, $level + 1); } unset($var[$marker]); $output[] = "$space),"; } return implode("\n", $output); } else { return htmlspecialchars(print_r($var, TRUE), ENT_NOQUOTES, Kohana::$charset) . ','; } } } // End Optimize 



рдпрд╣ рдореЙрдбрд▓ рд╡рд░реНрдЧ рдХреЛрдб рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЖрдк рдЕрднреА рднреА рдХреЛрдб рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдлреЙрд░реНрдо рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:
 Model_Option protected $_table_columns = array( 'id' => array( 'type' => 'int', 'is_nullable' => FALSE, ), 'name' => array( 'type' => 'string', 'is_nullable' => FALSE, ), 


рд╕реНрд╡рдпрдВ рдХрдХреНрд╖рд╛ (/application/classes/optimize.php рдореЗрдВ рд╣реЛрд╕реНрдЯ рдХреА рдЧрдИ)ред рдХрд╣реАрдВ рд╕реЗ рднреА рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУ:
  echo Optimize::list_columns(); 

рд╡рд┐рдзрд┐ рдХрд╛ рдкреНрд░рдорд╛рдг рдореЙрдбрд▓ рдХреЗ рдореБрджреНрд░рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ last_query рдХреА рдХрдореА рд╣реИред
рдЫрд╡рд┐

рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдкрд╛рдП рдЧрдП - blogocms.ru/2011/05/kohana-uskoryaem-orm - рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╢рд┐рдВрдЧред рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди, рд▓реЗрдХрд┐рди рдЧрддрд┐ рдореЗрдВ рднреА рдХрдо рдЗрд╖реНрдЯрддрдоред

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдФрд░ рдкрд░реАрдХреНрд╖рдг


рдЧрддрд┐ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдореИрдВ рд╕рдЯреАрдХрддрд╛ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛)ред рдЪрд▓реЛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ
 $token = Profiler::start('Model', 'User'); ORM::factory('user')->with('profile')->with('profile:file'); Profiler::stop($token); echo View::factory('profiler/stats'); 

рдФрд░ рдЗрд╕реЗ 10 рдмрд╛рд░ рдЪрд▓рд╛рдПрдВред рд╣рдореЗрдВ $ _table_columns рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рднрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ , рдФрд╕рддрди, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдкреВрд░рд╛ рдХрд╛рдо 0.15 рд╕реЗрдХрдВрдб рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ 0.005 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдХрдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рднрд░реЗ рд╣реБрдП $ _table_columns рдХреЗ рд╕рд╛рде - рдФрд╕рдд 0.145 рд╕реЗрдХрдВрдбред рд╡рд┐рдХрд╛рд╕ 3.3%

рд╣рдо рдХрдИ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗред
 $token = Profiler::start('Model', 'User'); for ($index = 0; $index < 10; $index++) { ORM::factory('user')->with('profile')->with('profile:file')->get_user(array(rand(1,100), rand(1,100))); } Profiler::stop($token); echo View::factory('profiler/stats'); 

$ _Table_columns рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдкреВрд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдФрд╕рддрди 0.18 рд╕реЗрдХрдВрдб рдЦрд░реНрдЪ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ 0.015 рд╕реЗрдХрдВрдбред рддрд╛рд▓рд┐рдХрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрдиред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рдХрд╛рд╕ рдЫреЛрдЯрд╛ рд╣реИ - 2.8%

рдмреЗрд╢рдХ, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╕реНрд╡рдпрдВ рдХреЛрдб рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдВрдЧреА рдФрд░ ORM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреАред ORM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрдореА 1.5 - 3 рдЧреБрдирд╛ рд╣реИ, рдЬреЛ MySQL рд╕рд░реНрд╡рд░ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ MySQL рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП, 2-3% рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧрддрд┐ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреАред

рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╢реВрдиреНрдп рд╣реИ - рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЬреЛ рдПрдХ рд▓рд╛рдЗрд╡ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ $ _table_columns рд╕рд░рдгреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдирдП рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдирдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рд╕рд░рдгреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ рд▓реЗрдЦ рдХрд╛ рд╕рд╣-рд▓реЗрдЦрдХ - рдпреВрдирд┐рдХреНрд╕ 44 , рдЬреЛ рд▓рд╛рд▓рдЪреА рдирд╣реАрдВ рд╣реИ - рдПрдХ рдирд┐рдордВрддреНрд░рдг рджреЗ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In154865/


All Articles