2016-12-09 4 views
4

Я новичок в Laravel. Все, что я пытаюсь сделать, это следующее:Laravel как обновить значение в mysql только при изменении значения

У меня есть поля в моей форме, такие как НАЗВАНИЕ, ОПИСАНИЕ.

TITLE Поле уникально в базе данных.

Это то, что я сделал для обновления моих ценностей.

$product    = Product::find($id); 
$product->title  = $request->title; 
$product->description = $request->description; 
$product->save(); 

Но это даст ошибку (это значение уже существует), как мой TITLE поля уникальное.

Все, что я хочу, чтобы это обновить TITLE только если значение TITLE изменяется в противном случае обновления то же значение, но обновить другие поля. Спасибо

+0

http://stackoverflow.com/questions/28866500/laravel-eloquent-update-just-if-changes-have-been-made это может помочь вам ... –

ответ

4

Что-то вроде этого?

$product = Product::find($id); 

if ($product->title == $request->title) { 
    $product->description = $request->description; 
} else { 
    $product->title = $request->title; 
} 

$product->save(); 
+0

Я хочу обновить определенную строку, которая дается Я бы. Я думаю, что над функцией будет изменена любая строка, название которой соответствует. Это так. Спасибо – nasor

+0

Пожалуйста, проверьте обновленный ответ. Вы получите строку из БД. Затем вы проверите, изменилось ли название. Если название было изменено, оно будет обновлять только заголовок. Если нет, он обновит только описание. Это поведение, которое вы ищете? –

0

Я не видел ни одной структуры вашей базы данных или кода формы, только маленький фрагмент над вами.

вы могли бы сделать что-то вроде этого ...

$checkTitle = Product::where('title', '=', $request->input('title')->first(); 

Вы также можете сделать ...

$record = Product::find($id) 

    if($request->input('title') === $record->title){ 
    // Record with the $id has the same title as you are posting in the request. 
    }else{ 
     // Title for $id lets say id number 3, Is not the same as the form request you are sending so now Perform insert 
     } 


    if(count($checkTitle) >= 1){ 
     // Means the title exists and do what ever you want... 
    // Perform update 
    }else{ 
     // Perform insert 
    } 

Извините за короткий и сладкий, в результате чего ехать в офис и думал, что это могло бы помочь отправить сейчас. Дайте мне знать, если я ошибаюсь, и я могу помочь.

1

Код, который вы опубликовали, делает точно (если косвенно) то, что вы говорите, что хотите. Ваша проблема другая: вы назначаете заголовок, который используется в другом месте, тем самым нарушая уникальность.

Вы должны подтвердить, что заголовок новый еще не используется.

$duplicate = Product::where('title', '=', $request->title)->where('id', '!=', $id)->first(); 

На данный момент не ясно, что вы хотите сделать:

а) Хотите ли вы использовать дубликат записи вместо в одном указанном $id?

b) Это ошибка?

c) Следует ли обновлять запись $id, оставив заголовок в одиночку?

Вы можете делать все это; что вы не может do «обновить мой TITLE, только если значение TITLE изменено», потому что измененное значение уже используется в другом месте.

0

Вы можете использовать заявление if, чтобы проверить значение столбца в столбце так же, как и у оригинала?

$currentProduct   = Product::find($id); 
//Check and update if title not same 
if($currentProduct->title == $request->title){ 
    $currentProduct->description = $request->description; 
} 
//Update title and description... 
else { 
    $currentProduct->title   = $request->title; 
    $currentProduct->description = $request->description; 
} 

$currentProduct->save(); 
0

Вы должны посмотреть на функцию wasChanged() в Laravel.

+0

У вас есть документация или информация об этой функции isChanged? Я везде искал, и я ничего не могу найти. –

+0

Здесь вы идете - https://laravel.com/api/5.5/Illuminate/Database/Eloquent/Concerns/HasAttributes.html#method_isDirty –

+0

спасибо тонну! Ты восхитителен –

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