Модели индекса поиска доктрины, не сгенерированные методом generateModelsFromYaml () - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь создать поисковую систему для своего проекта с поисковым поведением Doctrine 1.2, я следовал рекомендациям руководства и создал YAML со ссылками на мои поля поиска.И вызовите функцию generateModelsFromYaml для создания моих моделей php, все модели php создаются без ошибок, но модели таблиц индекса поиска отсутствуют ...

Извлечение моего файла YAML:

DIFFichier:
  tableName: ens_diffusion.DIF_Fichiers
    columns:
      DOC_Id:
        type: integer(4)
        primary: true
        notnull: true
        autoincrement: true
      DOC_Categorie:
        type: integer(4)
        default: 0
      DOC_Description:
        type: string(256)
      DOC_Adresse:
        type: string(256)
        options:
          charset: utf8
          type: InnoDB
    actAs:
      Searchable:
      fields: [DOC_Description] 

Доступные для поиска поля создаются в модели, здесь я правильно генерирую модель с именем "DIFFichier", но соответствующая индексная таблица "d_i_f_fichier_index" отсутствует

    $searchable0 = new Doctrine_Template_Searchable(array(
         'fields' => 
         array(
          0 => 'DOC_Description',
         ),
         ));
    $this->actAs($searchable0);

Я генерирую свои модели PHP таким образом

include_once "Doctrine-1.2.3/Doctrine.php";
spl_autoload_register(array('Doctrine', 'autoload'));

    Doctrine::generateModelsFromYaml(
    'diffusion2.yml', 
    'C:\Documents and Settings\admin\Desktop\modelsDoctrine', 
    array(
        'doctrine'
    ), 
    array(
        'classPrefix' => 'Diffusion_Model_', 
        'classPrefixFiles' => false
    )
);

Я все еще не могу сгенерировать свои индексные таблицы, есть ли другой способ сгенерировать мои таблицы из моего файла YAML?

1 Ответ

0 голосов
/ 16 июня 2011

Я наконец нашел ответ:

Во-первых, кажется, что таблицы индексов не генерируются методом generateModelsFromYaml (), но, скорее всего, создаются по мере необходимости Doctrine непосредственно в базе данных ...

Поэтому я попытался сгенерировать их вручную с помощью метода generateSqlFromArray () в моих ранее сгенерированных моделях, но Doctrine выдает исключение при создании поля первичного ключа.После некоторых исследований я обнаружил, что в случае создания индексных таблиц первичный ключ индексированного должен быть строчным.

Но схема базы данных была заблокирована.Итак, я нашел обходной путь:

  • Я запустил небольшое регулярное выражение в своем файле YAML, чтобы сделать все мои первичные ключи строчными, поэтому такой ключ, как "IND_Id", стал "ind_id".

  • Я снова сгенерировал свои модели с новым шаблоном YAML.

  • Я вызвал метод generateSqlFromArray () для вновь созданной модели и извлекSQL CREATE таблиц индексов.

  • Я вставил этот код SQL в свою базу данных

Теперь все работает нормально, даже с моими оригинальными моделями, несмотря наих первичные ключи еще в верхнем регистре ...

Вот сценарий, который я создал для нижнего регистра первичных ключей

$src = file_get_contents("source.yml");

//Lower case the primary key
$src = preg_replace("/([A-Z]{3}_[A-Z]{1}[a-z]*:)/e", "strtolower('\\1')", $src);

file_put_contents("source_lower.yml", $src);

А теперь сценарий для генерации кода создания SQL моего индексастолы

require_once("../config.php");

$tables = array();
$dirname = '../include/models/generated/';
$dir = opendir($dirname); 

//Extract the classname from the filenames
while($file = readdir($dir)) {
    if($file != '.' && $file != '..' && !is_dir($dirname.$file)){

        $classe = substr($file, 4, strlen($file) -8);
        $tables[] = $classe;
    }
}

//Generate SQL create for index tables
foreach($tables as $t){
    $sql = Doctrine_Core::generateSqlFromArray(array($t));
    afficher($sql[1]);
}

//Print the SQL code if CREATE
function afficher($str){
    if(substr($str, 0, 6) == "CREATE"){
        echo $str.";<br/>";
    }
}
...