public static function getCascadeQueueAndSetNulls(IEntity $entity, IModel $model, $withCascade, &$queuePersist, &$queueRemove)
{
$entityHash = spl_object_hash($entity);
if (isset($queueRemove[$entityHash])) {
return;
}
$repository = $model->getRepositoryForEntity($entity);
$repository->attach($entity);
$repository->doFireEvent($entity, 'onBeforeRemove');
list($pre, $post, $nulls) = static::getRelationships($entity);
$prePersist = [];
static::setNulls($entity, $nulls, $model, $prePersist);
if (!$withCascade) {
$queueRemove[$entityHash] = $entity;
return;
}
foreach ($prePersist as $value) {
$queuePersist[spl_object_hash($value)] = $value;
}
foreach ($pre as $value) {
if ($value instanceof IEntity) {
static::getCascadeQueueAndSetNulls($value, $model, true, $queuePersist, $queueRemove);
} elseif ($value instanceof IRelationshipCollection) {
foreach ($value->getIterator() as $subValue) {
static::getCascadeQueueAndSetNulls($subValue, $model, true, $queuePersist, $queueRemove);
}
$queuePersist[spl_object_hash($value)] = $value;
}
}
$queueRemove[$entityHash] = $entity;
unset($queuePersist[$entityHash]);
foreach ($post as $value) {
if ($value instanceof IEntity) {
static::getCascadeQueueAndSetNulls($value, $model, true, $queuePersist, $queueRemove);
} elseif ($value instanceof IRelationshipCollection) {
foreach ($value->getIterator() as $subValue) {
static::getCascadeQueueAndSetNulls($subValue, $model, true, $queuePersist, $queueRemove);
}
$queuePersist[spl_object_hash($value)] = $value;
}
}
}