gpt4 book ai didi

php - 我如何强制 laravel 在 sync() 方法中进行批量(多个)插入?

转载 作者:可可西里 更新时间:2023-11-01 13:26:40 28 4
gpt4 key购买 nike

当我使用 sync() 方法时,laravel 在我的中间表中执行大量单独的插入查询,如下所示:

INSERT INTO `tag_user` (`user_id`, `tag_id`) VALUES ('59', '60')
INSERT INTO `tag_user` (`user_id`, `tag_id`) VALUES ('59', '61')

我希望它像这样进行一次多次插入:

INSERT INTO `tag_user` (`user_id`, `tag_id`) VALUES ('59', '60'), ('59', '61')

这可能吗?我正在使用 MySql。如果有 attach() 方法可以像 detach() 方法那样接受数组,那就太好了。有人这样做吗?

最佳答案

我是这样解决的:

我的模型

在我的应用程序中,每个用户都有很多标签(多对多关系)。它叫做toxi数据库架构。我的用户表称为“用户”,标签表称为“标签”。中间表称为“tag_user”,其中包含“tag_id”和“user_id”列。

用户模型:

class User extends \Eloquent 
{
public static $timestamps = false;

public function tags()
{
return $this->has_many_and_belongs_to('Models\Tag');
}
}

标签模型:

class Tag extends \Eloquent 
{
public static $timestamps = false;
}

我如何替换 sync() 方法

这就是我如何使用多个插入强制 Laravel 执行 sync() 方法:

//$currentUser is a model loaded from database
//Like this: $currentUser = Auth::user();

$newLinks = array();
$idsToSync = array();

foreach ($tags as $tag)
{
array_push($idsToSync, $tag->id);
}

//$currentUser->tags()->sync($idsToSync);

$currentIds = $currentUser->tags()->pivot()->lists('tag_id');

$idsToAttach = array_diff($idsToSync, $currentIds);

foreach ($idsToAttach as $value)
{
$newLink = array(
'user_id' => $currentUser->id,
'tag_id' => $value
);

$newLinks[] = $newLink;
}

if (count($newLinks) > 0)
{
\DB::table('tag_user')->insert($newLinks);
}

$idsToDetach = array_diff($currentIds, $idsToSync);

if (count($idsToDetach) > 0)
{
$currentUser->tags()->detach($idsToDetach);
}

此代码执行一次多次插入,而不是多次插入。

关于php - 我如何强制 laravel 在 sync() 方法中进行批量(多个)插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13433977/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com