Принудительная очистка базы данных с помощью Propel - PullRequest
2 голосов
/ 04 января 2012

Вот пример моих таблиц

<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 ]

4 голосов
/ 17 января 2012

Я нашел обходной путь, который заключается в отключении пула .

Propel::disableInstancePooling();

Добавить в файл setup.php. Но затем он полностью отключает функцию, которая снижает производительность.

1 голос
/ 21 января 2012

Как насчет добавления нового метода в вашу модель 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.

...