将名称属性用于 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.
如果我添加值为 Author
的 phpName
属性,则连接工作正常:
$messages = MessagesQuery::create()->joinWith('Author')->findByRecipientId($id);
因为我有很多外键并且我想要 minimum/none 手动工作问题是:如何在不手动添加所有 phpName
属性的情况下解决这个问题。要么我找到一种方法来访问具有常规名称属性的外键,要么有一种方法可以告诉 propel 在构建模型时设置 phpName
属性?
我希望有人有想法,会很有帮助! :)
foreign-key
s name
属性仅用于模式迁移,不适用于您的实际 PHP 代码。因此,要么你在任何地方定义一个有用的 phpName
,要么你扩展 MysqlSchemaParser
并添加类似的东西:
$fk->setPhpName($name);
然后您可以通过 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);
我最近开始使用 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.
如果我添加值为 Author
的 phpName
属性,则连接工作正常:
$messages = MessagesQuery::create()->joinWith('Author')->findByRecipientId($id);
因为我有很多外键并且我想要 minimum/none 手动工作问题是:如何在不手动添加所有 phpName
属性的情况下解决这个问题。要么我找到一种方法来访问具有常规名称属性的外键,要么有一种方法可以告诉 propel 在构建模型时设置 phpName
属性?
我希望有人有想法,会很有帮助! :)
foreign-key
s name
属性仅用于模式迁移,不适用于您的实际 PHP 代码。因此,要么你在任何地方定义一个有用的 phpName
,要么你扩展 MysqlSchemaParser
并添加类似的东西:
$fk->setPhpName($name);
然后您可以通过 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);