#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
Трассировка стека
- в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php в строке 315 —
- в 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)))
- в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php в строке 315 в DocumentPersister ->executeUpsert (array(), array())
- в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Persisters/DocumentPersister.php в строке 296
- в DocumentPersister ->executeUpserts (array()) в vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/UnitOfWork.php в строке 1189
- в 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']);