добавление таблиц в БД

Hitman, все эти функции правильный и работают. Просто у rosko модель по другому вызывается/инициализируется. Вот и все :) просто перепиши метод model или же выясни у rosko как он это делает  ;D

вы уж меня извините за тупняк, но что в model надо переписать? в смысле что не так? не догоняю  >:(

Ну скорее всего там и надо вызывать проверку на наличие таблицы… я сам хз :)

ладно, ждем rosko, может он нас просветит?  ;)

надо переопределить model в своей прослойке? а что он будет возвращать тогда?

Действительно, у меня просто работа с моделью начинается чуть по-другому. Поэтому мой код на 100% примером быть не может.

Ты вот сделай так. Переопредели model() в прослойке:



	public static function model($className=__CLASS__)


	{


		if (!self::tableExists()) {


			self::createTable();


			self::insertInitData();


		}


		return parent::model($className);


	}


И опиши в прослойке методы: tableExists() - для проверки реального существования таблицы; createTable() - для создания таблицы; insertInitData() - по желанию, для вставки исходных данных.

А вот как может выглядеть tableExists():



	public function tableExists()


	{


            $command = Yii::app()->db->createCommand("show table status");


            $reader = $command->query();


            while (($row = $reader->read()) !== false) {


                if ($row["Name"] == self::tableName()) return true;


            }


            return false;


	}


Только оптимизируй как-то, а то проверка будет выполняться при каждом использовании метода mode().

ну черновой вариант примерно такой:

Прослойка:



<?php





Abstract Class SActiveRecord extends CActiveRecord


{


	


   public static function model($className=__CLASS__)


   {


      if (!self::tableExists()) 


      {


         $this->createTable();


         //self::insertInitData();


      }


      return parent::model($className);


   }


   


   public function tableExists()


   {


            $command = Yii::app()->db->createCommand("show table status");


            $reader = $command->query();


            while (($row = $reader->read()) !== false) {


                if ($row["Name"] == self::tableName()) return true;


            }


            return false;


   }


	


	/*public function getMetaData()


    {


        $status = self::tableExists();


        if  ((1 == 1)&&(Yii::app()->params["autoInstallModules"]))


        {


            $this->createTable();


        }


        return parent::getMetaData();


    }*/


    


    public function createTable();


    {


    	$data = self::getSchema();


  		$sql = file_get_contents($data['dump']);





		foreach (explode($data['sep'],$data['sql']) as $query)


		{


    		$query = trim($query);


    		if (!empty($query))


    		{


				$command = $connection->createCommand($query)->execute();


				return true;


    		}


    		else


	    	{


	    		return false;	


	    	}


  		}


    }


в модели:






    public function getSchema()


	{


	    return array(


	    	'sql' => './protected/modules/advertisements/config/schema_advertisements.sql',


	    	'sep' => ';',


	    	)	


	}

вы не поверите, опять ничерта не работает. ни одного признака жизни.(

Зачем в цикле делаешь return true или return false? У тебя тогда функция будет заканчиваться после первого удачного запроса. Это первое.

И второе. explode($data[‘sep’],$data[‘sql’]) - что ты парсишь? файл или его название? :)

И даже третье. Мне кажется не разумно парсить файл только по одному символу. Что будет, если точка с запятой встретятся не самих данных? Правильно, глюк.

Например, покопайся в том же phpMyAdmin и узнай каким образом там парсится файл.

И даже четвертое. Сделай парсинг до цикла, а то у тебя файл будет заново парситься при каждой иттерации.

Все, собрался в кучу, когда приехал щас на дачу, остался наедине с кодом на полчасика, допилил все ошибки, а их оказалось немало и - ура, заработало! От меня огромное спасибо rosko, Digital God и персонально по плюсу в карму :) спасибо!

В следующей версии ожидается появление CFormModel::init() и CActiveRecord::init().

Наверно его будет удобнее использовать для инсталляции/обновления таблиц в БД.

http://code.google.c…e/detail?r=1243

Проверка на существование таблицы, учитывая префикс :P


Yii::app()->db->schema->getTable('{{users}}')

Дерзайте, сэнсэи))