【发布时间】:2015-05-20 14:09:57
【问题描述】:
我希望我只是遗漏了一些东西,但我花了一天时间试图自己解决这个问题。
我正在尝试将一些 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');
});
我是否忽略了一些愚蠢的错误?提前感谢您的帮助!
更新
经过更多调查,仅添加 ONE 标签有效。这导致我转向不同的方向,我发现为了在一个语句中插入多行,数据库必须由 SQL Server 2008 或更高版本运行。不幸的是,我需要运行的服务器很长时间没有更新,只运行 SQL Server 2005(9.0 版)。
我现在唯一能想到的就是使用foreach 循环遍历每个tag_id 并单独附加它们。谁能想到替代解决方案?
【问题讨论】:
-
我不太了解 MS SQL Server 语法,但我认为 laravel 生成的插入语句是问题所在。一个插入有许多值对。插入 [ninja_job_tag] ([job_id], [tag_id]) 值 (1, 1), (1, 3), (1, 5), (1, 7), (1, 8), (1, 10) ;您可以在您的 MS SQL sql 控制台中尝试此语句吗?你是否配置 laravel 为 MS SQL 生成?
-
以纯 SQL 运行它会产生相同的错误。我把它缩小到只有一个标签,它工作正常。 (
insert into [ninja_job_tag] ([job_id], [tag_id]) values (1, 1);) -
好的,那就是问题所在。 Lavarell 产生错误的 sql。但是抱歉,今天我第一次听说 lavarell。我唯一的建议是您在 Lavarell 中配置了错误的方言,或者这只是一个错误。
-
感谢@PeterPaulKiefer 为我指明了这个方向,事实证明这是因为我需要用于数据库的服务器是由 SQL Server 2005 运行的,因此不支持在其中插入多行一个声明。
标签: php sql-server laravel laravel-5