当我使用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()
方法接受数组会很高兴。有人这样做了吗?
答案 0 :(得分:1)
雅,几天前我正在做同样的事情,
eloquent在一个sql中进行多次插入。
但要确保所有循环都是相同的列和字段,我试图删除第一次没有值的那个,并且mysql不会工作......
例如:
array(
array('name' => 'blah'),
array('name' => 'blah')
)
User::insert($data)
但是如果你想更新现有记录而不是你需要进行原始查询。
例如:
$keyString = '("';
$valString = '("';
foreach ($blah as $k => $v) {
$keyString .= $k . '", '
}
目标是返回类似这样的内容
$keyString // (name, email, bla, bla)
$valString // ('john doe', 'email@email.com', 'bla', 'bla'), ('someone', 'email@email.com', 'bla', 'bla'),
大于
DB::query( 'replace into users' . $keyString . ' values ' . $valString );
确保使用数组计数来检查是否是逗号的最后一个数组
例如:
(++counter === count ? '),' : ')' ;
这需要重构
答案 1 :(得分:1)
这就是我解决它的方法:
在我的应用程序中,每个用户都有许多标签(多对多关系)。它被称为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);
}
此代码执行一次多次插入而不是多次插入。
答案 2 :(得分:1)
解决方法是使用Laravel的DB::transaction()
并将同步作为闭包放入其中。