2015-05-03 44 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