使用Propel强制数据库刷新


Force database flush using Propel

下面是我的表的一个例子

<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,以便下次访问时它已经存在?

有没有其他方法可以在不强制"冲洗"的情况下实现这一点?我不想手动跟踪用户。

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

我找到了一个解决方法,即禁用

Propel::disableInstancePooling();

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

在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模型中。