Как найти и объединить два ряда в один - PullRequest
0 голосов
/ 28 апреля 2020

Я новичок в Laravel, поэтому я запутался, как это сделать

У меня есть таблица с именем groups, где я забываю использовать unique при проверке. Спустя долгое время я обнаружил, что существует несколько данных с одним и тем же именем для ex: у меня есть два данных с таким же именем, называемым феминизмом, но с другим идентификатором. Таблица группы имеет только столбцы name и description, но она имеет отношение к продуктам many to many У меня есть и другие данные с таким же именем, я хочу объединить эти данные в одно. наряду с отношением к продукту. Возможно ли это?

Должен ли я проверить все имена вручную, например

Item::where('name','Feminism')->get();

, а затем объединить эти данные, или у нас есть другие подходящие методы

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Вы можете изменить этот код для ваших моделей и отношений

    foreach ($groups as $group) {
        $duplicates = Group::where('name', $group->name)->where('id', '<>', $group->id)->get();
        foreach ($duplicates as $duplicate) {
            $mustBeUpdatedRelation = $duplicate->products;
            $anotherRelation = $duplicate->anotherRelation;
            foreach ($mustBeUpdatedRelation as $product) {
                $product->categories()->detach($duplicate->id); // if product has pivot data you must get these and assign to new relation

                //new relation
                $product->categories()->attach($group->id);
            }

            $anotherRelation = $duplicate->anotherRelation;
            foreach ($anotherRelation as $item) {
                // like above
                // detach duplicated
                // attach unique
            }

            //finally you can delete or .... duplicated group
            $duplicate->update([
                'name' => "duplicated_$duplicate->name"
            ]);
        }
    }
0 голосов
/ 28 апреля 2020

Вы можете использовать следующие

$items = App\Item::with('products')->get();

$tempArr = [];
foreach ($items as $key => $item) {
    if(isset($tempArr[$item->name])) {

        $merged = $tempArr[$item->name]['products']->merge($item->products);

        unset($tempArr[$item->name]['products']);
        $tempArr[$item->name]['products'] = $merged;

    } else {

        $tempArr[$item->name] = $item;
    }
}


foreach ($tempArr as $item) {
    $item->products()->sync($item->products->pluck('id')); 
}

$idsToKeep = array_column($tempArr, 'id');

App\Item::whereNotIn('id', $idsToKeep )->delete();

Использовать каскад onDelete при определении миграции сводной таблицы. Это позаботится об удалении связей модели для вас: например,

$table->foreign(’item_id’)
      ->references(’id’)->on(’items’)
      ->onDelete(’cascade’);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...