Laravel多对多SQL Server错误

时间:2015-05-20 14:09:57

标签: php sql-server laravel laravel-5

我希望我只是遗漏了一些东西,但我花了一天的时间试图让自己弄明白这一点。

我正在努力尝试将某些tags同步到job

我已经运行dd()以确保提交标签时提交的是数组,并确保我的关系在laravel中正确连接。

但是,在使用标记创建新作业时(没有标记可以正常工作,因为实际上没有插入),会出现此错误:

SQLSTATE[42000]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]
Incorrect syntax near ','. (SQL: insert into [ninja_job_tag] ([job_id], [tag_id]) 
values (1, 1), (1, 3), (1, 5), (1, 7), (1, 8), (1, 10))

这是附加代码($job已正确创建):

$tagIDs = Input::get('tags') || [];
$job->tags()->attach(Input::get('tags'));

这是Job.php调用tags

的功能
public function tags()
{
    return $this->belongsToMany('App\Models\Marketing\Tag','ninja_job_tag');
}

这是Tag.php调用jobs

的功能
public function jobs()
{
    return $this->belongsToMany('App\Models\Marketing\Job','ninja_job_tag');
}

以下是数据透视表的迁移:

Schema::create('ninja_job_tag', function(Blueprint $table)
{
    $table->integer('job_id')->unsigned()->index();
    $table->foreign('job_id')->references('id')->on('ninja_jobs')->onDelete('cascade');
    $table->integer('tag_id')->unsigned()->index();
    $table->foreign('tag_id')->references('id')->on('ninja_tags')->onDelete('cascade');
});

我是否忽视了一些愚蠢的错误?在此先感谢您的帮助!

更新

经过一些调查后,只添加一个标签。这导致我朝不同的方向看,我发现为了在一个语句中插入多行,数据库必须由SQL Server 2008或更新版本运行。这很不幸,但我需要运行的服务器在很长一段时间内没有更新,只运行SQL Server 2005(版本9.0)。

我现在唯一能想到的就是使用foreach遍历每个tag_id并单独附加它们。谁能想到替代解决方案?

1 个答案:

答案 0 :(得分:0)

Laravel已设置(应该如此)以发送一个insert语句,该语句将一次添加多行。出现错误的原因是连接的SQL Server版本是SQL Server 2005(版本9.0),不支持支持一个insert语句中的多行。

如果您遇到此问题,则需要执行以下两项操作之一:

  1. 将SQL Server更新为至少SQL Server 2008
  2. 使用foreach附加关系PER关系:
  3. $tags = Input::get('tags');
    foreach($tags as $tag){
        $job->tags()->attach($tag);
    }
    

    这是一个不幸的解决方法,因为您将为正在创建的每个关系运行一个execute语句,但除非创建Eloquent的自定义覆盖以在attach语句中使用UNION,否则必须这样做。