public function save(Many2ManyAttribute $attribute)
{
$collectionName = $attribute->getIntermediateCollection();
$firstClassName = $this->extractClassName($attribute->getParentEntity());
$secondClassName = $this->extractClassName($attribute->getEntity());
// Ensure index
$indexOrder = [$firstClassName, $secondClassName];
list($indexKey1, $indexKey2) = $this->arr($indexOrder)->sort()->val();
$index = [$indexKey1 => 1, $indexKey2 => 1];
Entity::getInstance()->getDatabase()->ensureIndex($collectionName, $index, ['unique' => 1]);
/**
* Insert values
*/
foreach ($attribute->getValue() as $item) {
$firstEntityId = $attribute->getParentEntity()->getId()->getValue();
if ($item->getId()->getValue() === null) {
$item->save();
}
$secondEntityId = $item->getId()->getValue();
$data = [$firstClassName => $firstEntityId, $secondClassName => $secondEntityId];
try {
Entity::getInstance()->getDatabase()->insert($collectionName, $this->arr($data)->sortKey()->val());
} catch (\MongoException $e) {
continue;
}
}
/**
* The value of many2many attribute must be set to 'null' to trigger data reload on next access.
* If this is not done, we may not have proper links between the 2 entities and it may seem as if data was missing.
*/
$attribute->setValue(null);
}