2010-03-25 46 views
1

在Doctrine的一張桌子上是否可以有多個slu??一張表可以在Doctrine中有多個slu?嗎?

我在YAML文件試過這樣:

Article: 
    tableName: tst_article 
    actAs: 
    Sluggable: 
     unique: true 
     fields: [title] 
     canUpdate: true 
    Sluggable: 
     unique: true 
     fields: [text] 
     name: secondSlug 
    columns: 
    id: 
     type: integer(8) 
     primary: true 
     autoincrement: true 
    category_id: 
     type: integer(8) 
    title: 
     type: text(255) 
    text: 
     type: clob 

但生成只有secondSlug中生成的SQL後...

+2

提示:如果你想在數據庫中使用前綴表名'$管理器 - >的setAttribute(Doctrine_Core :: ATTR_TBLNAME_FORMAT, 'tst_%S');''那裏$ manager'是Doctrine_Manager'的'實例。 – Crozin 2010-03-26 08:28:14

回答

5

這是可能的。在您的表格定義中寫入:

public function setUp() { 
    parent::setUp(); 

    $sluggable0 = new Doctrine_Template_Sluggable(array(
     'fields' => array(0 => 'name'), 
     'unique' => true, 
     'canUpdate' => true 
    )); 
    $this->actAs($sluggable0); 

    $sluggable1 = new Doctrine_Template_Sluggable(array(
     'fields' => array(0 => 'native_name'), 
     'unique' => false, 
     'canUpdate' => false, 
     'name' => 'native_name_slug' 
    )); 
    $this->actAs($sluggable1); 
} 

問題出在YAML本身。你有這樣的事情:

keyA: 
    keyB: value 
    keyB: value 

什麼可能被翻譯成:

array(
    'keyA' => array(
     'keyB' => 'value', 
     'keyB' => 'value' 
    ) 
); 

所以你看有一種keyB定義,然後keyB改寫爲新的價值。所以在你的YAML文件中,第二個定義覆蓋第一個定義。

如何解決?我不知道,但我會做一些研究。現在你不得不用純PHP來聲明你的模型。

0
Article: 
    tableName: tst_article 
    actAs: 
    Sluggable: 
     unique: true 
     fields: [title, text] 
     canUpdate: true 
    columns: 
    id: 
     type: integer(8) 
     primary: true 
     autoincrement: true 
    category_id: 
     type: integer(8) 
    title: 
     type: text(255) 
    text: 
     type: clob 
0

雖然不建議更改庫,但有時這是一個必要的惡魔。通過非常小的更改,您可以在YAML中聲明Sluggable_1Sluggable_2等。

--- a/lib/vendor/doctrine/Doctrine/Import/Builder.php 
+++ b/lib/vendor/doctrine/Doctrine/Import/Builder.php 
@@ -711,8 +711,10 @@ class Doctrine_Import_Builder extends Doctrine_Builder 
    { 
     // find class matching $name 
     $classname = $name; 
-  if (class_exists("Doctrine_Template_$name", true)) { 
-   $classname = "Doctrine_Template_$name"; 
+  // HACK to allow multiple Sluggables 
+  $classname = preg_replace('/_[0-9]+$/', '', $classname); 
+  if (class_exists("Doctrine_Template_$classname", true)) { 
+   $classname = "Doctrine_Template_$classname"; 
     } 
     return "  \$" . strtolower($name) . "$level = new $classname($option);". PHP_EOL; 
    } 
相關問題