【问题标题】:Laravel Many-to-Many SQL Server ErrorLaravel 多对多 SQL Server 错误
【发布时间】: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


【解决方案1】:

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

如果您遇到此问题,您需要做以下两件事之一:

  1. 将您的 SQL Server 至少更新到 SQL Server 2008
  2. 使用foreach 附加关系 PER 关系:

.

$tags = Input::get('tags');
foreach($tags as $tag){
    $job->tags()->attach($tag);
}

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

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2016-11-24
    • 2021-11-21
    • 2016-12-14
    • 1970-01-01
    • 2021-07-06
    • 2018-02-06
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多