2015-05-20 15 views
0

Я надеюсь, что я просто что-то пропустил, но я потратил целый день, пытаясь разобраться в этом самостоятельно.Laravel Ошибка многих серверов SQL Server

Я работаю над попыткой синхронизации 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'); 
}); 

ли я с видом какой-то глупую ошибку? Заранее благодарю за любую помощь!


UPDATE

После некоторых более расследование, добавив только один тег работает. Это заставило меня взглянуть в другом направлении, и я обнаружил, что для того, чтобы вставить несколько строк в один оператор, база данных ДОЛЖНА запускаться SQL Server 2008 или новее. Это неудачно, но сервер, который мне нужно запустить, не был обновлен в течение длительного времени и работает только с SQL Server 2005 (версия 9.0).

Единственное, что я могу сейчас придумать, это использовать foreach для прокрутки КАЖДОГО tag_id и присоединить их отдельно. Может ли кто-нибудь подумать о альтернативном решении?

+1

Я не знаю синтаксиса MS SQL Server, чтобы убедиться, но, я думаю, что инструкция insert, созданная laravel, является проблемой. Для одной вставки существует много пар значений. вставить в [ninja_job_tag] ([job_id], [tag_id]) значения (1, 1), (1, 3), (1, 5), (1, 7), (1, 8), (1, 10); Не могли бы вы попробовать это заявление в своей консоли SQL SQL sql? Вы настроили laravel для производства MS SQL? –

+0

Выполнение этого в обычном SQL дает ту же ошибку. Я сузил его до одного тега, и он отлично работает. ('insert into [ninja_job_tag] ([job_id], [tag_id]) значения (1, 1);') –

+0

Хорошо, вот в чем проблема. Lavarell производит неправильный sql. Но, извините, сегодня я впервые услышал о lavarell. Мое единственное предложение состоит в том, что вы настроили неправильный диалект в Lavarell или это просто ошибка. –

ответ

0

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 в заявлениях прикрепляются, это придется сделать.