private function buildBuckets($models, $link, $viaModels = null, $viaLink = null, $checkMultiple = true)
{
if ($viaModels !== null) {
$map = [];
$viaLinkKeys = array_keys($viaLink);
$linkValues = array_values($link);
foreach ($viaModels as $viaModel) {
$key1 = $this->getModelKey($viaModel, $viaLinkKeys);
$key2 = $this->getModelKey($viaModel, $linkValues);
$map[$key2][$key1] = true;
}
}
$buckets = [];
$linkKeys = array_keys($link);
if (isset($map)) {
foreach ($models as $model) {
$key = $this->getModelKey($model, $linkKeys);
if (isset($map[$key])) {
foreach (array_keys($map[$key]) as $key2) {
$buckets[$key2][] = $model;
}
}
}
} else {
foreach ($models as $model) {
$key = $this->getModelKey($model, $linkKeys);
$buckets[$key][] = $model;
}
}
if ($checkMultiple && !$this->multiple) {
foreach ($buckets as $i => $bucket) {
$buckets[$i] = reset($bucket);
}
}
return $buckets;
}