6

当我使用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()方法会很好。有人这样做吗?

4

3 回答 3

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 ? '),' : ')' ;

这需要重构

于 2012-11-18T00:17:22.083 回答
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()方法

这就是我强迫 laravelsync()使用多个插入的方法:

//$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);
}

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

于 2012-11-18T08:26:23.697 回答
1

一种解决方法是使用 LaravelDB::transaction()并将同步作为闭包放入其中。

于 2013-01-27T17:55:51.227 回答