|
|
|
@ -142,35 +142,42 @@ trait ActiveRelationTrait
|
|
|
|
|
*/ |
|
|
|
|
private function buildBuckets($models, $link, $viaModels = null, $viaLink = null) |
|
|
|
|
{ |
|
|
|
|
$buckets = []; |
|
|
|
|
$linkKeys = array_keys($link); |
|
|
|
|
foreach ($models as $i => $model) { |
|
|
|
|
$key = $this->getModelKey($model, $linkKeys); |
|
|
|
|
if ($this->indexBy !== null) { |
|
|
|
|
$buckets[$key][$i] = $model; |
|
|
|
|
} else { |
|
|
|
|
$buckets[$key][] = $model; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($viaModels !== null) { |
|
|
|
|
$viaBuckets = []; |
|
|
|
|
$map = []; |
|
|
|
|
$viaLinkKeys = array_keys($viaLink); |
|
|
|
|
$linkValues = array_values($link); |
|
|
|
|
foreach ($viaModels as $viaModel) { |
|
|
|
|
$key1 = $this->getModelKey($viaModel, $viaLinkKeys); |
|
|
|
|
$key2 = $this->getModelKey($viaModel, $linkValues); |
|
|
|
|
if (isset($buckets[$key2])) { |
|
|
|
|
foreach ($buckets[$key2] as $i => $bucket) { |
|
|
|
|
$map[$key2][$key1] = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$buckets = []; |
|
|
|
|
$linkKeys = array_keys($link); |
|
|
|
|
|
|
|
|
|
if (isset($map)) { |
|
|
|
|
foreach ($models as $i => $model) { |
|
|
|
|
$key = $this->getModelKey($model, $linkKeys); |
|
|
|
|
if (isset($map[$key])) { |
|
|
|
|
foreach (array_keys($map[$key]) as $key2) { |
|
|
|
|
if ($this->indexBy !== null) { |
|
|
|
|
$viaBuckets[$key1][$i] = $bucket; |
|
|
|
|
$buckets[$key2][$i] = $model; |
|
|
|
|
} else { |
|
|
|
|
$viaBuckets[$key1][] = $bucket; |
|
|
|
|
$buckets[$key2][] = $model; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
foreach ($models as $i => $model) { |
|
|
|
|
$key = $this->getModelKey($model, $linkKeys); |
|
|
|
|
if ($this->indexBy !== null) { |
|
|
|
|
$buckets[$key][$i] = $model; |
|
|
|
|
} else { |
|
|
|
|
$buckets[$key][] = $model; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
$buckets = $viaBuckets; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!$this->multiple) { |
|
|
|
|