Symfony не находит недавно сохраненную сущность - Doctrine / Symfony - PullRequest
1 голос
/ 18 октября 2019

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

Вот код для записей:

// Create first entry

$debitCode = 'bank';
$creditCode = 'equity';
// Create entry
$accountEntry = new AccountEntry();
$accountEntry->setAmount($amount);
$debitAccount = $unit->getAccountByType($debitCode);
if (!$debitAccount) {
    // Create debit account
    $debitAccountType = $em->getRepository('App:AccountType')->findOneBy(['code' => $debitCode]);
    $debitAccount = new Account();
    $debitAccount->setType($debitAccountType);
    $em->persist($debitAccount);
}
$debitAccount->debit($amount);

$accountEntry->setDebitAccount($debitAccount);

$creditAccount = $unit->getAccountByType($creditCode);
if (!$creditAccount) {
    // Create credit account
    $creditAccountType = $em->getRepository('App:AccountType')->findOneBy(['code' => $creditCode]);
    $creditAccount = new Account();
    $creditAccount->setType($creditAccountType);
    $em->persist($creditAccount);
}
$creditAccount->credit($amount);

$accountEntry->setCreditAccount($creditAccount);

$em->persist($accountEntry);
$em->flush();



// Create second entry

$debitCode2 = 'accountsPayable';
$creditCode2 = 'bank';

$accountEntry2 = new AccountEntry();
$accountEntry2->setAmount($amount);
$debitAccount = $unit->getAccountByType($debitCode2);
if (!$debitAccount) {
    // Create debit account
    $debitAccountType = $em->getRepository('App:AccountType')->findOneBy(['code' => $debitCode2]);
    $debitAccount = new Account();
    $debitAccount->setUnit($unit);
    $debitAccount->setType($debitAccountType);
    $em->persist($debitAccount);
}
$debitAccount->debit($amount);

$accountEntry2->setDebitAccount($debitAccount);

$creditAccount = $unit->getAccountByType($creditCode2);
if (!$creditAccount) {
    // Create credit account
    $creditAccountType = $em->getRepository('App:AccountType')->findOneBy(['code' => $creditCode2]);
    $creditAccount = new Account();
    $creditAccount->setUnit($unit);
    $creditAccount->setType($creditAccountType);
    $em->persist($creditAccount);
}
$creditAccount->credit($amount);

$accountEntry2->setCreditAccount($creditAccount);

$em->persist($accountEntry2);
$em->flush;

А вот функция getAccountByType :

/**
 * Get Account by type of account.
 */
public function getAccountByType($code)
{
    $filter = function ($account) use ($code) {
        if ($account->getType()->getCode() == $code) {
            return $account;
        }
    };
    $accounts = $this->accounts->filter($filter)->getValues();

    return isset($accounts[0]) ? $accounts[0] : null;
}

1 Ответ

0 голосов
/ 18 октября 2019

И, конечно же, через 30 минут после того, как я отправил вопрос, я сам нашел ответ (несмотря на то, что несколько дней бился головой о стену перед публикацией).

По сути, нам нужно обновить сущность $ unit после сохранения / сброса начальной записи:

$em->refresh($unit);

В противном случае метод getAccountByType, по-видимому, не учитывает изменения. Таким образом, оказывается, что методы сущностей не учитывают сброшенные изменения в базе данных, если сущность не обновляется. Наверное, простые вещи, но я этого не знал. Надеюсь, это спасет многих от неприятностей.

...