| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | <?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\test;use yii\base\ArrayAccessTrait;use yii\base\InvalidConfigException;/** * BaseActiveFixture is the base class for fixture classes that support accessing fixture data as ActiveRecord objects. * * For more details and usage information on BaseActiveFixture, see the [guide article on fixtures](guide:test-fixtures). * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */abstract class BaseActiveFixture extends DbFixture implements \IteratorAggregate, \ArrayAccess, \Countable{    use ArrayAccessTrait;    use FileFixtureTrait;    /**     * @var string the AR model class associated with this fixture.     */    public $modelClass;    /**     * @var array the data rows. Each array element represents one row of data (column name => column value).     */    public $data = [];    /**     * @var \yii\db\ActiveRecord[] the loaded AR models     */    private $_models = [];    /**     * Returns the AR model by the specified model name.     * A model name is the key of the corresponding data row in [[data]].     * @param string $name the model name.     * @return null|\yii\db\ActiveRecord the AR model, or null if the model cannot be found in the database     * @throws \yii\base\InvalidConfigException if [[modelClass]] is not set.     */    public function getModel($name)    {        if (!isset($this->data[$name])) {            return null;        }        if (array_key_exists($name, $this->_models)) {            return $this->_models[$name];        }        if ($this->modelClass === null) {            throw new InvalidConfigException('The "modelClass" property must be set.');        }        $row = $this->data[$name];        /* @var $modelClass \yii\db\ActiveRecord */        $modelClass = $this->modelClass;        $keys = [];        foreach ($modelClass::primaryKey() as $key) {            $keys[$key] = isset($row[$key]) ? $row[$key] : null;        }        return $this->_models[$name] = $modelClass::findOne($keys);    }    /**     * Loads the fixture.     *     * The default implementation simply stores the data returned by [[getData()]] in [[data]].     * You should usually override this method by putting the data into the underlying database.     */    public function load()    {        $this->data = $this->getData();    }    /**     * Returns the fixture data.     *     * @return array the data to be put into the database     * @throws InvalidConfigException if the specified data file does not exist.     * @see [[loadData]]     */    protected function getData()    {        return $this->loadData($this->dataFile);    }    /**     * {@inheritdoc}     */    public function unload()    {        parent::unload();        $this->data = [];        $this->_models = [];    }}
 |