【问题标题】:Force database flush using Propel使用 Propel 强制刷新数据库
【发布时间】:2012-01-04 17:32:33
【问题描述】:

这是我的表格示例

<table name="user">
  <column name="name" type="varchar" size="255" required="true" />
</table>

<table name="environment">
  <column name="user_id" type="integer" size="11" required="true" />
  <column name="insertion_time" type="timestamp" required="true" phpName="InsertionTime" />

  <foreign-key foreignTable="user" phpName="User">
    <reference local="user_id" foreign="id"/>
  </foreign-key>
</table>

我想插入一些与他们的user 链接的environment

function insertEnvironment($id) {
    $user = findUser($id);

    $env = new Environment();
    $env->setUser($user);
    $env->setInsertionTime(new DateTime());

    $env->save();
}

function findUser($id) {
    $user = UserQuery::create()->filterByUserId($id)->findOneOrCreate();
    return $user;
}

我可以在同一页面上插入多个 environment,但如果 user 已经存在,我不想重新创建它。

现在,每次我插入 environment 时,它都会创建一个 user(在同一页面执行期间,之后它会按预期工作)。

如何强制插入user,以便下次我想访问它时它已经存在?

是否有另一种方法可以在不强制“刷新”的情况下实现这一目标? 我不想手动跟踪用户。

编辑:我更改了创建用户的方式(上面的代码已编辑),但没有帮助。

【问题讨论】:

    标签: php orm propel


    【解决方案1】:

    我找到了一个解决方法,就是禁用 pooling

    Propel::disableInstancePooling();
    

    在 setup.php 文件中添加。 但它随后会完全禁用该功能,从而降低性能。

    【讨论】:

    • 5 年多以后,不,我不能。对不起
    【解决方案2】:

    在你的 ActiveRecord 模型中添加一个新方法怎么样?

    例如类似的东西:

    <?php
    
    class User extends BaseUser
    {
        // Override the generated method
        public function addEnvironment($env)
        {
            $env->setInsertionTime(new DateTime());
    
            parent::addEnvironment($env);
        }
    }
    

    然后,从查找或创建用户开始:

    <?php
    
    $user = UserQuery::create()->filterByUserId($id)->findOneOrCreate();
    
    for ($i = 0; $i < $nbEnvironments; $i++) {
        $user->addEnvironment(new Environment());
    }
    
    // Save all
    $user->save();
    

    您不会获得多个用户对象,并且您只能使用一个事务来进行所有数据操作。当您想向用户插入一些环境时,最好将此逻辑添加到 User ActiveRecord 模型中。

    【讨论】:

    • 很遗憾我无法获得这样的环境。它们一个接一个地出现(就像一个日志系统),没有办法像你那样做一个循环。所以你确认现在有办法强制刷新?
    • 如果他们一个接一个地出现,那么您也可以在脚本的末尾保存整个,不是吗?循环只是在这里向您展示,您可以在保存用户之前添加所有环境。
    • 正如我在问题中所说:我可以,但 findOneOrCreate() 似乎没有找到已经在内存中创建但没有持久化的用户。我可以自己在内存中保存所有用户的列表,但 Propel 不是要为我管理它吗?
    • (我接受了这个问题来给你赏金,但我希望能得到更多关于这种行为的激励。谢谢:))
    • 这可能是一个不受支持的功能...我不确定它应该以这种方式工作。我要检查代码。
    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多