使用Propel强制数据库刷新

时间:2012-01-04 17:32:34

标签: php orm 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>

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

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

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

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

有没有另一种方法可以实现这一目标而不强迫“冲洗”? 我不想手工跟踪用户。

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

2 个答案:

答案 0 :(得分:4)

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

Propel::disableInstancePooling();

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

答案 1 :(得分:1)

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