Yii рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдореИрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рд╢реБрдн рджрд┐рди, рдкреНрд░рднрд╛рдордВрдбрд▓!

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


рдЬрдм рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдпрд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рд╕реБрд▓рдн рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЦрддрд░рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ ActiveRecord рдореЙрдбрд▓, рдПрдХреНрд╕рдкреЗрдВрд╕ рдФрд░ рдпрд╣ рдХреЛрдб рд╣реИ:
$modelOne = Expence::model()->findByPk(10); $modelTwo = Expence::model()->findByPk(10); var_dump($modelOne === $modelTwo); //  false 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдореЙрдбрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ (рдЬреЛ рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ)ред
 $modelOne->someField = "Data"; $modelOne->save(); /// ...- ... echo $modelTwo->someField; //    $modelTwo->save(); //     



рдирд┐рд░реНрдгрдп


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рд░реНрдЯрд┐рди рдлрд╛рдЙрд▓рд░ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдореИрдк рдирд╛рдордХ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЙрдирдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ 5 рдХреА рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдорд┐рд▓реЗрдЧрд╛ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, Yii рдореЙрдирд┐рдЯрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
 <?php /** * Singleton class to manipulate instances of models (eg CActiveRecord). * * @author Yuriy Ratanov <organium@gmail.com> */ class ObjectWatcher { /** * Current instance of ObjectWatcher * @var ObjectWatcher */ private static $_instance; /** * Array of objects to work with. * @var array */ private $objects = array(); /** * Geting instance of ObjectWatcher. * @return ObjectWatcher */ static function getInstance(){ if(!isset(self::$_instance)){ self::$_instance = new ObjectWatcher; } return self::$_instance; } /** * Getting instance of the object existing in the current application. * @param string $className * @param int $id * @return mixed null or object of the class $className with an id = $id if it exists. */ static function getRecord($className, $id) { $inst = self::getInstance(); $key = "$className.$id"; if(isset($inst->objects[$key])){ return $inst->objects[$key]; } return null; } /** * Adding object to ObjectWatcher registry. * @param $obj * @param int $id */ static function addRecord($obj, $id) { $inst = self::getInstance(); $inst->objects[$inst->getKey($obj, $id)] = $obj; } function getKey($obj, $id){ return get_class($obj).'.'.$id; } } 


AddRecord рдФрд░ getRecord рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдореЙрдбрд▓ рдХреА рдПрдХ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рдПрдХ рдореЙрдбрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ "class_name.id" => рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рд╣реИ)ред

рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Yii рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдЕрднреА рддрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдпрд╛ $ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд░рдгреА рд╕реЗ рдореМрдЬреВрджрд╛ рдПрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо Yii рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдмрд┐рдирд╛ CActiveRecord рдХреЗ рдмрд╛рдж рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЗрдпрд░ рдмрдирд╛рдПрдВрдЧреЗред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХреНрд╕рдкреЗрдВрд╕ :: рдореЙрдбрд▓ () -> findByPk (10) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд┐рдП рдмрд┐рдирд╛ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди Yii рдореЗрдВ рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╡реНрдпрд╡рд╕реНрдерд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, CActiveRecord :: рдкрд╣рд▓реЗFFind () рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ findByPk () рдХреЗ рдмрд╛рдж, рдЗрд╕рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред CActiveRecord :: рддрддреНрдХрд╛рд▓ () рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
 <?php class Expence extends CActiveRecord { //...-  protected function instantiate($attributes) { if(($record = ObjectWatcher::getRecord(get_class($this), $attributes['id'])) != false){ //   ,       $model = $record; }else{//           $model = parent::instantiate($attributes); ObjectWatcher::addRecord($model, $attributes['id']);//     } return $model; } //...-  } 

рдЕрдм рдмрд╕ рдЗрддрдирд╛ рд╣реА
 $modelOne = Expence::model()->findByPk(10); $modelTwo = Expence::model()->findByPk(10); var_dump($modelOne === $modelTwo); // true 


рд╕рдВрджрд░реНрдн:

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


All Articles