将名称属性用于 Propel 连接

Using name attribute for Propel joins

我最近开始使用 Propel (PHP ORM),我很喜欢它,但我有一个非常烦人的问题,即使尝试了很多也无法解决。我使用逆向工程来创建我的 schema.xml,它在连接之前一直很好用。可悲的是,对于我所有的外键,逆向工程只添加了 name 而不是 phpName 属性。无论我尝试将此 name 属性用于连接,我都会失败。在我手动添加 phpName 属性(当然然后重建模型)后,连接工作正常。

这是 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 值的各种变体,但 none 有效。在模式之上,此设置处于活动状态:defaultPhpNamingMethod="underscore"

错误推进拉出是:Unknown relation messages_ibfk_1 on the Messages table.

如果我添加值为 AuthorphpName 属性,则连接工作正常:

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

因为我有很多外键并且我想要 minimum/none 手动工作问题是:如何在不手动添加所有 phpName 属性的情况下解决这个问题。要么我找到一种方法来访问具有常规名称属性的外键,要么有一种方法可以告诉 propel 在构建模型时设置 phpName 属性?

我希望有人有想法,会很有帮助! :)

foreign-keys name 属性仅用于模式迁移,不适用于您的实际 PHP 代码。因此,要么你在任何地方定义一个有用的 phpName,要么你扩展 MysqlSchemaParser 并添加类似的东西:

$fk->setPhpName($name);

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

然后您可以通过 migration.parserClass 配置 属性 使用这个新的反向 class。 更多信息请点击此处 http://propelorm.org/documentation/reference/configuration-file.html#reverse-engeneering。请记住:如果您更改此 属性,您将无法再为 database:reverse 命令传递 DSN。您需要将连接名称传递给它,在 propel.database.connections.

下的推进配置中定义

名称 messages_ibfk_1 指的是您物理 table 中索引的名称,而不是 relation/table。 joinWith() 需要 table 名称,在本例中它应该是 joinWith('users'),根据您的架构定义,它是外国 table.

所以正确的语法应该是: $messages = MessagesQuery::create()->joinWith('users')->findByRecipientId($id);