protected function _diffLinks($existing, $jointEntities, $targetEntities, $options = [])
{
$junction = $this->junction();
$target = $this->target();
$belongsTo = $junction->association($target->alias());
$foreignKey = (array) $this->foreignKey();
$assocForeignKey = (array) $belongsTo->foreignKey();
$keys = array_merge($foreignKey, $assocForeignKey);
$deletes = $indexed = $present = [];
foreach ($jointEntities as $i => $entity) {
$indexed[$i] = $entity->extract($keys);
$present[$i] = array_values($entity->extract($assocForeignKey));
}
foreach ($existing as $result) {
$fields = $result->extract($keys);
$found = false;
foreach ($indexed as $i => $data) {
if ($fields === $data) {
unset($indexed[$i]);
$found = true;
break;
}
}
if (!$found) {
$deletes[] = $result;
}
}
$primary = (array) $target->primaryKey();
$jointProperty = $this->_junctionProperty;
foreach ($targetEntities as $k => $entity) {
if (!$entity instanceof EntityInterface) {
continue;
}
$key = array_values($entity->extract($primary));
foreach ($present as $i => $data) {
if ($key === $data && !$entity->get($jointProperty)) {
unset($targetEntities[$k], $present[$i]);
break;
}
}
}
if ($deletes) {
foreach ($deletes as $entity) {
$junction->delete($entity, $options);
}
}
return $targetEntities;
}