2011-06-15 28 views
1

我試圖用Doctrine 1.2的搜索行爲爲我的項目構建一個搜索引擎,我遵循手冊的recomandation並構建了一個YAML並引用了我的搜索字段。 並調用generateModelsFromYaml函數來創建我的PHP模型,所有的PHP型號都沒有錯誤,但創建搜索索引表的模型缺少...不是generateModelsFromYaml()生成的學說搜索索引模型

我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] 

的seachable字段在模型中產生的,在這裏我正確生成一個名爲「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文件生成我的表?

回答

0

我終於找到了答案:

首先,它似乎索引表不被generateModelsFromYaml()方法生成的,但更可能是直接對數據庫進行必要的學說產生...

所以我試圖通過在我以前生成的模型上使用generateSqlFromArray()來生成manualy,但Doctrine在創建主鍵字段時拋出異常。經過一番研究,我發現在創建索引表的情況下,索引的主鍵必須是小寫字母。

但數據庫的方案被鎖定。所以,我發現了一個解決辦法:

  • 我跑我的YAML文件小的正則表達式,使我的所有主鍵小寫,所以像「IND_Id」一鍵變成了「ind_id」。

  • 我用新的YAML模板再次生成我的模型。

  • 我在新創建的模型上調用generateSqlFromArray()方法,並提取索引表的SQL CREATE。

  • 我貼在我的數據庫這個SQL代碼

現在一切正常,甚至用我的原車型,儘管他們的主鍵AR再上層套管...

這裏是我的腳本創建爲小寫的主鍵

$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); 

而且現在的腳本來生成我的索引表

0的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/>"; 
    } 
}