2015-05-03 42 views
0

我最近開始使用Propel(PHP ORM),我喜歡它,但我有一個很煩人的問題,即使經過大量嘗試仍無法解決。我使用逆向工程來創建我的schema.xml,它在連接時非常有用。不幸的是,對於我所有的外鍵,逆向工程只會添加name而不是phpName屬性。無論我嘗試如何使用此name屬性進行加入,我都會失敗。在我手動添加phpName屬性後(然後重建模型),連接工作正常。使用名稱屬性Propel加入

這裏是在schema.xml中的外鍵的片段(不phpName屬性明顯):

<foreign-key foreignTable="users" name="messages_ibfk_1"> 
    <reference local="creating_user_id" foreign="id"/> 
</foreign-key> 

這裏是我的加入(不工作)代碼:

$messages = MessagesQuery::create()->joinWith('messages_ibfk_1')->findByRecipientId($id); 

我試過各種各樣的joinWith值的變化,但沒有工作。在架構之上此設置激活:defaultPhpNamingMethod="underscore"

錯誤推進翻出是:Unknown relation messages_ibfk_1 on the Messages table.

如果我和值Author添加phpName attribut的連接工作正常那樣:

$messages = MessagesQuery::create()->joinWith('Author')->findByRecipientId($id); 

由於我有很多外鍵,而且我想要最小/無手動工作,所以問題是:如何解決此問題而無需手動添加所有phpName屬性。我可以找到一種方法來使用常規名稱屬性訪問外鍵,或者有一種方法可以讓構建模型時建立phpName屬性的方法?

我希望有人有一個想法,會是一個很大的幫助! :)

回答

0

foreign-key s name屬性僅用於模式遷移,不適用於您的實際PHP代碼中的用法。因此,無論你定義到處有用phpName或者例如延長MysqlSchemaParser並添加有類似:

$fk->setPhpName($name); 

https://github.com/propelorm/Propel2/blob/master/src/Propel/Generator/Reverse/MysqlSchemaParser.php#L349

然後,您可以通過使用migration.parserClass配置屬性使用這個新的反向類。 更多的信息在這裏http://propelorm.org/documentation/reference/configuration-file.html#reverse-engeneering。請記住:如果您更改此屬性,則無法再通過database:reverse命令的DSN。您需要傳遞一個連接名稱,在propel.database.connections的驅動配置中定義。

+0

非常感謝您對您有用的答案,尤其是所有的細節。我可能會在未來嘗試你的解決方案。由於我幾天沒有得到答案,我通過編寫一個小命令行工具來幫助自己,該工具爲模式中的每個外鍵添加phpName屬性。雖然我認爲這不能通過一個簡單的參數來激活,但這當然不是您的錯。再次感謝您的幫助,再次感謝。 – bobinrinder

0

名稱messages_ibfk_1引用物理表中索引的名稱,而不是關係/表。 joinWith()需要表名,在這種情況下,它應該是joinWith('users'),其中根據你的模式定義是外表。

因此正確synax應該是: $messages = MessagesQuery::create()->joinWith('users')->findByRecipientId($id);

+0

感謝您的回答,可惜這不起作用。我不知道它是不是一般工作,或者只是因爲我有多個外鍵指向同一個表。 – bobinrinder