Doctrine MongoDB ODM — ошибка с каскадным executeUpsert

#symfony #doctrine-mongodb

#symfony #doctrine-mongodb

Вопрос:

doctrine / mongodb-odm версия 1.0.8

У меня есть документ, в котором используются двунаправленные отношения «многие ко многим», ссылающиеся на себя. Изначально я получал ошибки, сообщающие мне, что я должен настроить cascade=persist . Я сделал это, и теперь я получаю очень странную ошибку doctrine. Мой документ:

 use DoctrineODMMongoDBMappingAnnotations as ODM;

/**
 * @ODMDocument(collection="ledger", repositoryClass="TngExampleBundleRepositoryLedgerRepository")
 */
class Ledger
{
    /**
     * @ODMId(strategy="AUTO")
     */
    protected $id;

    /**
     * If this is a payment, this will link to the debit ledger
     * @ODMReferenceMany(
     *      targetDocument="TngExampleBundleDocumentLedger",
     *      inversedBy="payment",
     *      strategy="addToSet",
     *      cascade={"persist"},
     *      simple=true
     * )
     */
    protected $payment_for;

    /**
     * If this is a debit, these are the payments and credits
     * @ODMReferenceMany(
     *      targetDocument="TngExampleBundleDocumentLedger",
     *      mappedBy="payment_for",
     *      strategy="addToSet",
     *      cascade={"persist"},
     *      simple=true
     * )
     */
    protected $payments;

    public function __construct()
    {
        $this->payments = new DoctrineCommonCollectionsArrayCollection();
        $this->payment_for = new DoctrineCommonCollectionsArrayCollection();
    }

    // all standard getters/setters with:
    public function addPaymentFor(TngExampleBundleDocumentLedger $paymentFor)
    {
        $this->payment_for[] = $paymentFor;
        $paymentFor->payments[] = $this;
    }

    public function removePaymentFor(TngExampleBundleDocumentLedger $paymentFor)
    {
        $this->payment_for->removeElement($paymentFor);
        $paymentFor->payments->removeElement($this);
    }
}
  

Теперь, когда я пытаюсь сохранить каскадные записи:

 $payment->setPaymentFor($ledger);
$dm->persist($payment);
  

Я получаю следующую ошибку:

Обратите внимание: неопределенный индекс: $set

Трассировка стека

  1. в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php в строке 315 —
  2. в ErrorHandler -> HandleError (‘8’, ‘Неопределенный индекс: $set’, ‘/var/www/etc-mongo-tng/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php’ , ‘315’, массив(‘data’ => array(), ‘options’ => array(‘upsert’ => true)))
  3. в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php в строке 315 в DocumentPersister ->executeUpsert (array(), array())
  4. в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php в строке 296
  5. в DocumentPersister ->executeUpserts (array()) в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/UnitOfWork.php в строке 1189
  6. в UnitOfWork -> executeUpserts (объект (ClassMetadata), массив (‘000000005a8560de00007fc48349ed60’ => объект (Реестр)), массив ()) в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/UnitOfWork.php в строке 425

Не похоже, что та же ошибка влияет на ветку 1.1.2. Если я исправлю DocumentPersister.php как следует, все это работает. Является ли это законной ошибкой? Должен ли я сделать PR?

 private function executeUpsert(array $data, array $options)
{
    // I added this line
    if (empty($data)) { return; }
    $options['upsert'] = true;
    $criteria = array('_id' => $data['$set']['_id']);
    unset($data['$set']['_id']);