পরিবর্তনগুলি করা হয়েছে কেবল যদি লারাভেল ইলিউভার্ট আপডেট


87

সেই রেকর্ডটিতে কোনও পরিবর্তন আনা হয়েছে, তবে কি লরভেলে স্পষ্টত মডেলগুলি ব্যবহার করে কোনও রেকর্ড আপডেট করার কোনও উপায় আছে? আমি কোনও ব্যবহারকারী চাইছি না যে কোনও ব্যবহারকারী বারবার কোনও কারণ ছাড়াই ডাটাবেসটির জন্য অনুরোধ করছে, পরিবর্তনগুলি সংরক্ষণ করার জন্য বোতামটি টিপুন। আমার একটি javascriptফাংশন রয়েছে যা পৃষ্ঠায় কিছু পরিবর্তন হয়েছে কিনা সে অনুযায়ী সেভ বোতামটিকে সক্ষম এবং অক্ষম করে, তবে সার্ভারের পাশেও এই জাতীয় বৈশিষ্ট্যটি নিশ্চিত করা সম্ভব কিনা তা আমি জানতে চাই if আমি জানি যে আমি নিজেই এটি সম্পাদন করতে পারি (অর্থাত: রেকর্ডটি কোনও অভ্যন্তরীণ কার্যকারিতার কাছে আবেদন না করে) কেবল রেকর্ডটি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করেই, তবে সেভাবে করার আগে, আমি জানতে চাই যে লারাভেল স্বতন্ত্র মডেলটি ইতিমধ্যে যত্ন নিয়েছে কিনা care এটি, তাই আমার চাকাটি পুনরায় আবিষ্কার করার দরকার নেই।

রেকর্ড আপডেট করার জন্য আমি এইভাবে ব্যবহার করি:

$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();

4
ডাটাবেস লগিং কেন সক্ষম করবেন না এবং তারপরে লগগুলি পরীক্ষা করে দেখুন আপনি কোনও সংরক্ষণ করার সময় অলৌকিকভাবে আসলে কী ক্যোয়ারী চালায়: আপনি সম্ভবত চমকপ্রদ হয়ে উঠতে পারেন
মার্ক বাকের

4
নোট করুন যে লারাভেল মডেলগুলি এমন একটি dirtyপতাকা ধারণ করে যা ডাটাবেসে কোনও আপডেটের প্রয়োজন হয় তা নির্ধারণের জন্য ব্যবহৃত হয় এবং findআপনি যে জায়গায় সেভ সঞ্চালন করেন সেখানে মূল কলামের মানগুলির সাথে তুলনা করে এই পতাকাটি সেট করা হয়েছে
মার্ক বাকের

@ মারকবেকার এটি দুর্দান্ত টিপ!
ব্যবহারকারী2755140

উত্তর:


180

আপনি ইতিমধ্যে এটি করছেন!

save()মডেলটিতে কিছু পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখবে। এটি না থাকলে এটি ডিবি কোয়েরি চালায় না।

কোডের প্রাসঙ্গিক অংশটি এখানে 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
}

দারুণ. ধন্যবাদ. আমি ভাবছি এখন আমি কীভাবে সেই নোংরা পতাকাটি অ্যাক্সেস করতে পারি তা জানার জন্য কোনও পরিবর্তন না করে আপডেটের চেষ্টা করা হয়েছিল কিনা? আমি বলতে চাইছি: সেই ক্রিয়াটির জন্য প্রত্যাবর্তন?
ব্যবহারকারী2755140

4
@ দাসিনাএ আপনি এটির isDirty()জন্য ব্যবহার করতে পারেন । আপডেট হওয়া উত্তরটি দেখুন
লুকাশজিটার

4
যারা এটি পড়ছেন তাদের কাছে এই উত্তরটি ব্যবহারের আগে নিশ্চিত করে দেখুন isDirty()
অ্যালেক্স

4
নেই getChanges()পদ্ধতি। আমার উত্তরটি স্ট্যাকওভারফ্লো.com
a/54132163/

আপনি যদি আপনার বৈশিষ্ট্যগুলি সঠিকভাবে না ফেলে থাকেন তবে এফওয়াইআই isDirty()হবে true। আমার কাছে একটি ভাসা ছিল যা ডাটাবেসে ঠিক একই রকম ছিল, কারণ আমি একটি স্ট্রিং দিয়ে ভাসাটি স্থাপন করছিলাম (উদাহরণস্বরূপ "10.50" এর পরিবর্তে "10.50") এটি এটিকে একটি পরিবর্তন হিসাবে সনাক্ত করবে এবং একটি আপডেট সম্পাদন করবে।
মার্টেন ডি গ্রাফ


11

আমি এই পদ্ধতিটি যুক্ত করতে চাই, আপনি যদি কোনও সম্পাদনা ফর্ম ব্যবহার করেন তবে আপনি আপনার update(Request $request, $id)কার্যকারিতা পরিবর্তনগুলি সংরক্ষণ করতে এই কোডটি ব্যবহার করতে পারেন :

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

মনে রাখবেন যে আপনার ইনপুটগুলির একই কলামের নামের সাথে নাম লিখতে হবে। fill()ফাংশন আপনার জন্য সব কাজ কি করতে হবে :)


4
এটি আসলে আমি যে উত্তরটি সন্ধান করছিলাম এটি হ'ল, আমি নামটি ভুলে গিয়েছিলাম fillএবং কীভাবে এটিতে ভর পাসের অনুরোধ জানাতে হয়। ধন্যবাদ! আমার আইডি পাস করার দরকার নেই, যদিও আমি আপডেট করছি, তাই এটি ইতিমধ্যে রয়েছে $request->id
ব্লেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.