我希望我只是遗漏了一些东西,但我花了一天的时间试图让自己弄明白这一点。
我正在努力尝试将某些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
并单独附加它们。谁能想到替代解决方案?
答案 0 :(得分:0)
Laravel已设置(应该如此)以发送一个insert
语句,该语句将一次添加多行。出现错误的原因是连接的SQL Server版本是SQL Server 2005(版本9.0),不支持支持一个insert
语句中的多行。
如果您遇到此问题,则需要执行以下两项操作之一:
foreach
附加关系PER关系:
$tags = Input::get('tags');
foreach($tags as $tag){
$job->tags()->attach($tag);
}
这是一个不幸的解决方法,因为您将为正在创建的每个关系运行一个execute语句,但除非创建Eloquent
的自定义覆盖以在attach语句中使用UNION
,否则必须这样做。