Phalcon: сделки и сложные модели

В моем проекте я имею предприятия стол, где все предприятия должны существовать (чтобы поддержать сложные внешние ключи), таким образом, я должен вставить дополнительный ряд в специальный стол (в этом списке предприятий) прежде, чем вставить ряд в мой образцовый стол, и я хотел спросить, что является лучшим способом сделать это.

Так, поскольку, следуя коду я должен вставить два ряда: в предприятие стол, затем заберите id для просто вставленного ряда, спасите его в текущей модели и вставьте в счета стол:

$account = new Account();
$account->name = 'John';
$account->save();//performs two inserts while creating model

Как я понял, я могу использовать beforeCreate() метод, чтобы вставить ряд в предприятие стол и забрать id для недавно созданного ряда, чего-то как это:

class Account
{
    public function beforeSave()
    {
        $entity = new \Entity();
        $entity->type = get_class($this);
        $entity->save();
        $this->id = $entity->id;
    }
}

Но этот путь, если так или иначе считают ряд, не будет вставлен, ряд в предприятие , стол будет существовать.

Then i thought to use transactions as shown in docs here http://docs.phalconphp.com/en/latest/reference/models.html#transactions

Но я не делаю unserstand, если у меня есть небольшие сделки для каждой модели:: создайте() метод, как он будет работать, когда мне будут нужны сделки для сложных операций?

например.

// controller action context
use Phalcon\Mvc\Model\Transaction\Manager as TxManager,
    Phalcon\Mvc\Model\Transaction\Failed as TxFailed;

try {

    //Create a transaction manager
    $manager = new TxManager();

   //Request a transaction
    $transaction = $manager->get();

    $account = new Account();
    $account->setTransaction($transaction);
    $account->name = "WALL·E";
    $account->created_at = date("Y-m-d");
    if ($account->save() == false) {//sub-transaction inside account::create() method
        $transaction->rollback("Cannot save account");
    }

    $accountPart = new AccountPart();
    $accountPart->setTransaction($transaction);
    $accountPart->type = "head";
    if ($accountPart->save() == false) {//sub-transaction inside accountPart::create() method
        $transaction->rollback("Cannot save account part");
    }

    //Everything goes fine, let's commit the transaction
    $transaction->commit();

} catch(TxFailed $e) {
    echo "Failed, reason: ", $e->getMessage();
}

Трудно вообразить, как это будет работать в большом проекте.. вложенные транзакции это не очень хорошо для работы базы данных

Также я думал о 3-м методе внедрения, я добавил, что это - код ниже, но это похоже на хакерское проникновение, и я также не хочу использовать его:

public function create($data = null)
{   
   //Create abstract entity instance
    $entity = new \Entity();
    $entity->type = get_class($this);

   //Save abstract entity
    if (!$entity->save()) {
        return false;
    }

   //Save current entity
    $this->id = $entity->id;
    $result = parent::create($data);

   //Remove abstract entity if current row was not saved
    if (!$result) {
        $entity->delete();
    }

    return $result;
}

Что лучший и легкий способ состоит в том, чтобы поддержать такие сложные предприятия?

1
nl ja de

1 ответы

Самый легкий способ осуществить сделки использует 0.9.0:

class Account
{
    public function beforeCreate()
    {
        $entity = new \Entity();
        $entity->type = get_class($this);
        $this->entity = $entity;
    }

    public function initialize()
    {
        $this->belongsTo(array('entity_id', 'Entity', 'id'));
    }

}

С другой стороны, менеджер транзакций создает изолированную связь, которые позволяют вам подвергать сомнению отчеты, измененные в текущем операционном снимке, также видеть не изолированные отчеты.

Here, there is an explanation of different transaction scenarios in the new docs: http://docs.phalconphp.com/en/0.9.0/reference/models.html#transactions

2
добавлено
Хм... есть ли шанс, например, к ряду "Предприятия" вставки обратной перемотки, если $account-> спасут (), то потерпит неудачу?
добавлено автор avasin, источник
если Счет так или иначе не будет сэкономлен, ряд Предприятия не будет создан, правильно? И второй вопрос: действительно ли возможно использовать неявные транзакции с ручными транзакциями (в слое действия диспетчера) и с изолированными сделками?
добавлено автор avasin, источник