यदि परिवर्तन किए गए हैं तो Laravel एलोक्वेंट अपडेट


86

क्या लारवेल में एक रिकॉर्ड को अद्यतन करने के लिए किसी ऐसे मॉडल का उपयोग किया जाता है जैसे कि उस रिकॉर्ड में कोई बदलाव किया गया हो? मैं नहीं चाहता कि कोई भी उपयोगकर्ता बिना किसी अच्छे कारण के डेटाबेस के लिए अनुरोध करे, सिर्फ बदलावों को बचाने के लिए बटन दबाए। मेरे पास एक javascriptफ़ंक्शन है जो पेज में कुछ बदल गया है या नहीं इसके अनुसार सहेजें बटन को सक्षम और अक्षम करता है, लेकिन मैं यह जानना चाहूंगा कि क्या सर्वर पक्ष पर भी इस तरह की सुविधा सुनिश्चित करना संभव है। मुझे पता है कि मैं इसे अपने आप से पूरा कर सकता हूं (मतलब: फ्रेमवर्क की आंतरिक कार्यक्षमता की अपील किए बिना) बस यह जांच कर कि क्या रिकॉर्ड बदल गया है, लेकिन इसे इस तरह से करने से पहले, मैं यह जानना चाहूंगा कि क्या लारवेल एलोक्वेंट मॉडल पहले से ही ध्यान रखता है इसलिए, मुझे पहिया को फिर से आविष्कार करने की आवश्यकता नहीं है।

यह वह तरीका है जो मैं रिकॉर्ड को अपडेट करने के लिए उपयोग करता हूं:

$product = Product::find($data["id"]);
$product->title = $data["title"];
$product->description = $data["description"];
$product->price = $data["price"];
//etc (string values were previously sanitized for xss attacks)
$product->save();

3
डेटाबेस लॉगिंग को सक्षम क्यों न करें और फिर लॉग्स को यह देखने के लिए जांचें कि प्रश्न क्या है जब आप एक बचत करते हैं तो वास्तव में निष्पादित होता है: आप सुखद आश्चर्यचकित हो सकते हैं
मार्क बेकर

4
ध्यान दें कि लारवेल मॉडल एक dirtyध्वज को धारण करता है जो यह निर्धारित करने के लिए उपयोग किया जाता है कि क्या डेटाबेस पर एक अद्यतन वास्तव में आवश्यक है, और यह ध्वज मूल findस्तंभ मानों की तुलना उस बिंदु पर किया जाता है जहां आप सहेजते हैं
मार्क बेकर

@MarkBaker यह एक शानदार टिप है!
user2755140

जवाबों:


176

आप पहले से ही कर रहे हैं!

save()जाँच करेगा कि क्या मॉडल में कुछ बदल गया है। यदि यह नहीं है तो यह एक db क्वेरी नहीं चलेगा।

यहाँ कोड का प्रासंगिक हिस्सा है Illuminate\Database\Eloquent\Model@performUpdate:

protected function performUpdate(Builder $query, array $options = [])
{
    $dirty = $this->getDirty();

    if (count($dirty) > 0)
    {
        // runs update query
    }

    return true;
}

getDirty()विधि बस एक प्रति में बचाया के साथ वर्तमान विशेषताओं तुलना originalजब मॉडल बनाया जाता है। यह syncOriginal()विधि में किया जाता है :

public function __construct(array $attributes = array())
{
    $this->bootIfNotBooted();

    $this->syncOriginal();

    $this->fill($attributes);
}

public function syncOriginal()
{
    $this->original = $this->attributes;

    return $this;
}

यदि आप जांचना चाहते हैं कि क्या मॉडल गंदा है तो कॉल करें isDirty():

if($product->isDirty()){
    // changes have been made
}

या यदि आप एक निश्चित विशेषता की जांच करना चाहते हैं:

if($product->isDirty('price')){
    // price has changed
}

एक दम बढ़िया। धन्यवाद। मुझे आश्चर्य है कि अब मैं उस गंदे झंडे को कैसे जान सकता हूं कि क्या बिना किसी बदलाव के अपडेट का प्रयास किया गया था? मेरा मतलब है: उस कार्रवाई के लिए वापसी?
user2755140

1
@DaseinA आप इसके लिए उपयोग कर सकते हैं isDirty()। अद्यतन जवाब देखें
lukasgeiter

2
इसे पढ़ने वालों के लिए, उपयोग करने से पहले इस उत्तर को अवश्य देखें isDirty()
एलेक्स

1
नहीं है getChanges()विधि। मेरे उत्तर की जाँच करें stackoverflow.com/a/54132163/1090395
Mladen Janjetovic

FYI करें isDirty()हो जाएगा trueअगर आप अपने गुण सही डाली नहीं है। मेरे पास एक फ्लोट था जो डेटाबेस में बिल्कुल वैसा ही था, हालांकि क्योंकि मैं फ्लोट को एक स्ट्रिंग के साथ सेट कर रहा था (उदाहरण 10.50 के बजाय "10.50") यह इसे एक बदलाव के रूप में पता लगाएगा और एक अपडेट करेगा।
मार्टेन डी ग्रेफ


11

मुझे यह विधि जोड़ना पसंद है, यदि आप एक संपादन फ़ॉर्म का उपयोग कर रहे हैं, तो आप अपने update(Request $request, $id)फ़ंक्शन में परिवर्तनों को बचाने के लिए इस कोड का उपयोग कर सकते हैं :

$post = Post::find($id);    
$post->fill($request->input())->save();

ध्यान रखें कि आपको अपने इनपुट्स को उसी कॉलम नाम के साथ नाम देना है। fill()फ़ंक्शन आपके लिए सभी कार्य करेगा :)


3
यह वास्तव में जवाब है जिसे मैं खोज रहा था, मैं नाम के बारे में भूल गया था fill, और इसके लिए बड़े पैमाने पर अनुरोध कैसे करें। धन्यवाद! मुझे im अपडेट करने के बाद से ID पास करने की आवश्यकता नहीं थी, इसलिए यह पहले से ही है $request->id
ब्लैंब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.