Метод syncWithoutDetaching
Метод syncWithoutDetaching применяется к отношению типа belongsToMany
и позволяет добавить новые связи, не удаляя существующие. Первым параметром
передаётся массив идентификаторов связываемых моделей. Вторым параметром
можно передать дополнительные данные для промежуточной таблицы.
Метод возвращает массив с информацией о добавленных связях.
Синтаксис
<?php
$model->relation()->syncWithoutDetaching($ids, $pivotData);
?>
Пример
Давайте добавим новые теги к статье, не удаляя существующие:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppModelsTag;
class ArticleController extends Controller
{
public function addTags()
{
$article = Article::find(1);
$tagIds = Tag::whereIn('name', ['php', 'laravel'])->pluck('id')->toArray();
$res = $article->tags()->syncWithoutDetaching($tagIds);
echo "Added tags count: " . count($res['attached']);
}
}
?>
Результат выполнения кода:
"Added tags count: 2"
Пример
Давайте добавим теги с дополнительными данными в промежуточной таблице:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppModelsTag;
class ArticleController extends Controller
{
public function addTagsWithPivotData()
{
$article = Article::find(2);
$tagIds = [1, 2, 3];
$pivotData = [
1 => ['position' => 1],
2 => ['position' => 2],
3 => ['position' => 3]
];
$res = $article->tags()->syncWithoutDetaching($tagIds, $pivotData);
echo "Added tags: " . implode(', ', $res['attached']);
}
}
?>
Результат выполнения кода:
"Added tags: 1, 2, 3"
Пример
Давайте добавим только теги, которые ещё не связаны со статьёй:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppModelsTag;
class ArticleController extends Controller
{
public function addUniqueTags()
{
$article = Article::find(3);
$existingTagIds = $article->tags()->pluck('tags.id')->toArray();
$allTagIds = Tag::pluck('id')->toArray();
$newTagIds = array_diff($allTagIds, $existingTagIds);
if (count($newTagIds) > 0) {
$res = $article->tags()->syncWithoutDetaching($newTagIds);
echo "Added new tags: " . implode(', ', $res['attached']);
} else {
echo "No new tags to add";
}
}
}
?>
Результат выполнения кода:
"Added new tags: 4, 5, 6"