我正试图用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_ficihier_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 SettingsadminDesktopmodelsDoctrine',
array(
'doctrine'
),
array(
'classPrefix' => 'Diffusion_Model_',
'classPrefixFiles' => false
)
);
我仍然无法生成索引表,有没有其他方法可以从我的YAML文件生成表?
我终于找到了答案:
首先,索引表似乎不是由generateModelsFromYaml()方法生成的,而是根据Doctrine的需要直接在数据库上创建的。。。
因此,我试图在之前生成的模型上使用generateqlFromArray()手动生成它们,但Doctrine在主键字段的创建上抛出了一个异常。经过研究,我发现在创建索引表的情况下,索引的主键必须是小写。
但是数据库的方案被锁定了。所以我找到了一个变通办法:
-
我在我的YAML文件上运行了一个小的正则表达式,使我所有的主键都小写,所以像"IND_Id"这样的键变成了"IND_Id"。
-
我用新的YAML模板再次生成了我的模型。
-
我对新创建的模型调用了generateqlFromArray()方法,并提取了索引表的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/>";
}
}