2012-01-04 3 views
2

Вот пример моих таблицфлеш базы данных Force с помощью 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, чтобы в следующий раз, когда я хочу получить к нему доступ, он уже существует?

Есть ли другой способ достичь этого, не нажимая «флеш»? Я не хочу отслеживать пользователей вручную.

Редактировать: Я изменил способ создания пользователя (код выше отредактирован), но это не помогает.

ответ

4

Я нашел обходное решение, которое должно отключить пул .

Propel::disableInstancePooling(); 

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

+0

Вы можете объяснить, как это дерьмо работает? – julestruong

+0

Более 5 лет спустя, я не могу. Извините – Jonas

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.

+0

Ну, к сожалению, я не могу получить такие среды. Они идут один за другим (например, система регистрации), и вы не можете сделать такой цикл, как вы. Итак, вы подтверждаете, что теперь есть способ заставить флеш? – Jonas

+0

Если они идут один за другим, то вы также можете сохранить целое в конце вашего скрипта, не так ли? Цикл только здесь, чтобы показать вам, вы можете добавить все свои среды прежде, чем сохранить пользователя. –

+0

Как я сказал в вопросе: я мог, но findOneOrCreate(), похоже, не находит пользователя, который уже создан в памяти, но не сохраняется. Я мог бы сохранить список всех пользователей в памяти сам, но разве это не для того, чтобы Propel мог управлять им для меня? – Jonas

Смежные вопросы