2015-07-14 5 views
0

У меня есть таблица:Как обновить конкретные строки, используя Laravel

ID|user_id|group_id|subject |book_id|duplicate 
1| 2  |3  |history |1  |   
2| 4  |3  |history |1  | 
3| 5  |3  |history |1  | 

Я хочу, чтобы результирующая таблица, чтобы выглядеть следующим образом:

ID|user_id|group_id|subject |book_id|duplicate 
1| 2  |3  |history |1  |   
2| 4  |3  |history |1  |1 
3| 5  |3  |history |1  |1 

Я хочу, чтобы все восходящие идентификаторы после самой низкой ID дубликата колонки для обновления до 1. ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: идентификаторы являются динамическими, и поэтому просто использование ->where(ID, '>', 1); не будет работать во всех случаях.

до сих пор у меня есть этот

$duplicates = DB::table('table') 
       ->where('subject', 'history') 
       ->where('book_id', 1) 
      ->skip(1)->take(1) 
      ->update(['duplicate' => 1]); 

Код выше не работает, потому что я получаю результирующую таблицу, которая выглядит следующим образом:

ID|user_id|group_id|subject |book_id|duplicate 
1| 2  |3  |history |1  | 1   
2| 4  |3  |history |1  | 
3| 5  |3  |history |1  | 
+0

Вы даже потрудились прочитать документацию Laravel? http://laravel.com/docs/master/eloquent#basic-updates –

ответ

0

Используйте этот

DB::table('table') 
->where('subject', 'history') 
->where('book_id', 1) 
->where('id', '>', 1) 
->update(['duplicate' => 1]); 
+0

Ваш ответ правильный, однако я отредактировал вопрос. Извините, я забыл упомянуть, что идентификатор является динамическим. – Billy

+0

Затем замените '1' переменной, которая хранит динамическое значение. i.e: '-> где ('id', '>', $ dynamicId)' –

+0

, конечно, да. thx – Billy

0

Вы пытаются применить смещение к запросу UPDATE, что не является допустимым SQL (я предполагаю, что que чень строитель молча игнорирует свой skip(1)->take(1) вызов, когда update() называется.)

Одним из способов достижения результата вы ищете, чтобы найти все идентификаторы, которые должны быть помечены как не-дубликат (продублировать = нуль), а затем обновлять каждый другая соответствующая запись.

Concrete книга

$original = DB::table('table') 
    ->select('id') 
    ->where('subject', 'history')->where('book_id', 1) 
    ->orderBy('id', 'asc')->first()->pluck('id'); // Lowest id 

DB::table('table') 
    ->where('subject', 'history')->where('book_id', 1) 
    ->whereNot('id', $original) // All, but one 
    ->update(['duplicate' => 1]); 

Все книги

$originals = DB::table('table') 
    // One for every combination of `subject` and `book_id` 
    ->groupBy('subject', 'book_id')>orderBy('id', 'asc') 
    ->lists('id'); 

DB::table('table') 
    ->whereNotIn('id', $originals) // All, but one for every book 
    ->update(['duplicate' => 1]); 

Вы можете дополнительно оптимизировать либо пример использовать подзапрос вместо двух отдельных запросов.

+0

Спасибо, но я не хочу обновлять каждую соответствующую запись, которая не соответствует не дублированию. Я хочу обновить все, кроме одного. – Billy

+1

@Billy, я написал исходный ответ в спешке, в результате чего код не сделал того, что я намеревался сделать. Я обновил его теперь с более четкой формулировкой, а также с правильным кодом. – nCrazed

+0

Прекрасно работает. – Billy

Смежные вопросы