Почему отложенная загрузка вложенных отношений для каждого элемента в коллекции приводит к загрузке тех же значений, что и отношение последнего элемента? - PullRequest
0 голосов
/ 30 мая 2019

Когда я лениво загружаю отношение для каждого элемента в коллекции на основе некоторого условия, все элементы в конечном итоге загружаются с одинаковым отношением. Это загруженное отношение для всех элементов является отношением последнего элемента.

Я попытался установить пользовательский атрибут как

$single->owner->parent->filenames = Model::where('id', $id);

но это тоже не работает. Вот мой код

$index->transform(function($single) use (&$i){

            if($single->content_type === 'type1') {

                $single->owner->parent->load('fileNames');

            } else if($single->content_type === 'type2') {

                //     $single->owner->parent->file_names = Model::where('id', $single->owner->id);

                $single->owner->parent->load(['fileNames' => function($q) use ($single) {
                    $q->where('file_names.id', $single->owner->id);
                }]);

            }

            return $single;
        });

В случае 'type2' я хочу, чтобы в $ single-> owner-> parent-> file_names была одна запись с идентификатором, заданным в предложении where

Но что я получаю, так это то, что все элементы в коллекции имеют то же значение атрибута owner-> parent-> file_names, что и атрибут owner-> parent-> file_names последнего элемента коллекции.

1 Ответ

0 голосов
/ 31 мая 2019

На самом деле мне не терпелось загрузить «родителя», и, похоже, красноречиво использует один и тот же объект отношения для всех элементов в коллекции, если отношение уже загружено раньше.Вид того, что я понял или догадался.

Я решил это, вручную установив атрибут отношения и клонировав «родительский» объект для каждого элемента в коллекции.Не очень элегантно, но работает для меня сейчас.

Пожалуйста, дайте мне знать, если у вас есть лучшее решение, используя laravel или красноречивые ленивые методы загрузки

$parentIds = $index->whereIn('content_type', ['type1', 'type2'])->load('owner')->pluck('owner.parent_id')->unique()->toArray();

$parents = collect([]);

foreach($parentIds as $singleParentId) {
    $parent = Parent::where('id',$singleParentId)->with('tags', 'category', 'titles')->withCount('allComments')->get()[0];
    $parents->put($singleParentId, $parent);
}


$index->transform(function($single) use ($parents) {
    if($single->content_type === 'type1' || $single->content_type === 'type2') {

        $single->owner->setAttribute('parent', clone $parents->get($single->owner->parent_id));

    }

    return $single;
});


$index->transform(function($single) {

    if($single->content_type === 'type1') {

        $fileNames = FileNames::where('parent_id', $single->owner->parent->id)->orderByRaw('lower(file_name) ASC')->limit(8)->get();

        $single->owner->parent->setAttribute('file_names', $fileNames);

    } else if($single->content_type === 'type2') {


        $fileNames = FileNames::where('parent_id', $single->owner->parent->id)->where('id', $single->owner->id)->get();

        $single->owner->parent->setAttribute('file_names', $fileNames);

    }

    return $single;
});
...