【问题标题】:Using name attribute for Propel joins使用 Propel 连接的名称属性
【发布时间】:2023-03-17 21:12:02
【问题描述】:

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

这里是schema.xml中外键的sn-p(显然没有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.

如果我添加 phpName 属性和值 Author,则连接可以正常工作:

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

由于我有很多外键并且我想要最少/无手动工作,问题是:如何在不手动添加所有 phpName 属性的情况下解决这个问题。要么我找到一种方法来使用它们的常规名称属性访问外键,要么有一种方法告诉 propel 在构建模型时设置 phpName 属性?

我希望有人有一个想法,会是一个很大的帮助! :)

【问题讨论】:

    标签: php mysql join foreign-keys propel


    【解决方案1】:

    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 配置属性来使用这个新的反向类。 更多信息在这里http://propelorm.org/documentation/reference/configuration-file.html#reverse-engeneering。请记住:如果更改此属性,您将无法再为 database:reverse 命令传递 DSN。您需要将连接名称传递给它,在 propel.database.connections 下的推进配置中定义。

    【讨论】:

    • 非常感谢您的有用回答,尤其是所有细节。我将来可能会尝试您的解决方案。由于几天没有得到答案,我帮助自己编写了一个小型命令行工具,该工具为模式中的每个外键添加了 phpName 属性。虽然我认为这不能通过一个简单的参数来激活,这有点令人遗憾,但这当然不是你的错。非常感谢您的帮助,再次感谢。
    【解决方案2】:

    名称messages_ibfk_1 是指物理表中索引的名称,而不是关系/表。 joinWith() 需要表名,在这种情况下应该是joinWith('users'),根据您的架构定义,它是外部表。

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

    【讨论】:

    • 感谢您的回答,遗憾的是这不起作用。我不知道它是否一般不起作用,或者只是因为我有多个外键指向同一个表。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2013-01-29
    相关资源
    最近更新 更多