【问题标题】:What's the most correct way around this propel "Cannot redeclare function" error?解决此推进“无法重新声明功能”错误的最正确方法是什么?
【发布时间】:2026-02-14 05:30:01
【问题描述】:

我有以下表格:

userlogbookuser_logbook

用户日志是一个联结表(schema.xml 中的isCrossRef="true"),包含user_idlogbook_id 外键。

我还想记住任何给定用户当前选择的日志,所以我在我的user 表中也放了一个current_logbook_id,并给它一个外键。但是,在我的 BaseUserQuery.php 文件中,我得到了两个 filterByLogbook() 函数。

我知道当你有两个外键指向同一个表时,来自同一个表,你会得到像getUserRelatedBySomething()getUserRelatedBySomethingElse()这样的函数,但是最好的方法是这种情况?

我当然可以删除外键并使用保存的 ID,或者我想我可以创建一个新的联结表(尽管这似乎不正确)。在这种情况下,最好的办法是在 MySQL Propel 中“做正确的事”(希望我能做到这两点!) .

【问题讨论】:

  • 除非已经有我不知道的方法,否则我怀疑正确的做法可能是分叉 Propel 并添加一个干净的方法来处理这种情况。想想善业吧!
  • 那么您是否相当有信心没有可能的方法?
  • 其实我觉得有——看我的回答

标签: mysql propel redeclare


【解决方案1】:

在您的schema.xml 中,将phpName and refPhpName attributes 添加到用户表定义中的外键:

  <table name="user" phpName="User">
    ...
    <foreign-key foreignTable="logbook" phpName="CurrentLogBook" refPhpName="CurrentLogBookUser">
      <reference local="current_logbook_id" foreign="id"/>
    </foreign-key>
    ...
  </table>

那么你应该得到filterByCurrentLogBook()filterByCurrentLogBookUser() 函数并且没有冲突。

【讨论】:

  • 不过是一个快速的问题——这是否应该使$user-&gt;getCurrentLogbook() 也可用?我没看到:/
  • 是的,我的测试设置中有它。
  • 啊,现在是 - 我的错。惊人的。谢谢!