এল্লোভেন্ট ব্যবহার করে কোনও টেবিলের সমস্ত সারি কীভাবে মুছবেন?


135

আমার অনুমানটি নিম্নলিখিত বাক্য গঠনটি ব্যবহার করা ছিল:

MyModel::all()->delete();

তবে তা কার্যকর হয়নি। আমি নিশ্চিত এটি অত্যন্ত সহজ, তবে আমি বিষয়টিতে নথিপত্র অনুসন্ধান করেছি এবং এটি খুঁজে পাচ্ছি না!

উত্তর:


279

কারণ MyModel::all()->delete()কাজ করে না কারণ all()প্রকৃতপক্ষে কোয়েরিটি বন্ধ করে দেয় এবং স্বতন্ত্র অবজেক্টগুলির সংকলন দেয় returns

আপনি কাটা পদ্ধতি ব্যবহার করতে পারেন, এটি লারাভেল 4 এবং 5 এর জন্য কাজ করে:

MyModel::truncate();

এটি পৃথক সারি মুছে ফেলা লগ না করে টেবিল থেকে সমস্ত সারি ফেলে দেয়।


1
ভবিষ্যতের পাঠকদের জন্য আমি আমার প্রশ্নের একটি লার্যাভেল 3 সমাধান যুক্ত করেছি।
পিট

39
খুশী হলাম। এটি
লারাভেল ৫

14
দ্রষ্টব্য: ছাঁটাই () কোনও যেকোন আউটপুট ক্রিম কাউন্টারকেও পুনরায় সেট করে (এছাড়াও নোট করুন যে আপনি যে টেবিলগুলিতে বিদেশী কী বাধা আছে তা কেটে ফেলতে পারবেন না))
উইলিয়াম টুরেল

10
এফওয়াইআই: টার্নকেট মোছা ইভেন্টগুলিকে ট্রিগার করবে না।
ফিউশন

1
আপনি যদি সত্যিই ব্যবহার করতে চান তবে MyModel::all()->delete()ব্যবহার করুনforeach (MyModel::all() as $e) { $e->delete() }
Ema4rl

70

লারাভেল 5.2+ সমাধান।

Model::getQuery()->delete();

কেবল টেবিলের নাম সহ অন্তর্নিহিত নির্মাতাকে ধরুন এবং যা কিছু করুন। এর চেয়ে কোনও পরিপাটি হতে পারে না।

লারাভেল 5.6 সমাধান

\App\Model::query()->delete();

9
এটি কেন কাজ করে সে সম্পর্কে অন্য যে কেউ বিভ্রান্ত হয়ে থাকলে, মডেল শ্রেণি এখানে __call যাদু পদ্ধতির মাধ্যমে বিল্ডারের কাছে পদ্ধতিগুলি ফরোয়ার্ড করে । কারণ আপনি যখন প্রকৃতপক্ষে বিল্ডার পদ্ধতিটি চান তখন মডেল শ্রেণিকে নিজেই একটি মোছার পদ্ধতি রয়েছে, মডেল :: ডিলিট () কল করে মডেল পদ্ধতিটি কল করে। সুতরাং নির্মাতাকে স্পষ্টভাবে পেতে, আপনি getQuery () ব্যবহার করতে পারেন।
কেভিনএলবস

এটি আপনি চাইলে সম্পর্কিত সারণীগুলিও মুছবেন না।
Terje Nesthus

এটি সমস্ত রেকর্ড মুছে ফেলতে বাধ্য করবে, নির্বিশেষে নরম মোছা চালু আছে বা বন্ধ
শালিনী

মডেল :: whereNotNull ( 'আইডি') -> মুছতে (); - নরম মোছা চালু থাকলে নরম মোছার কাজটি করবে
শালিনী

61

আপনি Model::truncate()যদি অক্ষম করে থাকেন তবে আপনি ব্যবহার করতে পারবেন foreign_key_checks(আমি ধরে নিই যে আপনি মাইএসকিউএল ব্যবহার করেন)।

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");


আপনি স্কিমা :: disableForeignKeyConstraints () ব্যবহার করতে পারেন; & স্কিমা :: সক্ষমফোরেইনকি কনস্ট্রেন্টস ();
ইলিয়াজার রিসান্ডেজ

33

আমি দুটি পদ্ধতিই বীজ ফাইলগুলিতে ব্যবহার করা দেখেছি।

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

যদিও আপনি বিদেশী কী সেট করতে চান তবে প্রথমটি ব্যবহার করতে পারবেন না ।

বিদেশী কী সীমাবদ্ধতায় রেফারেন্সযুক্ত একটি সারণী ছিন্ন করা যায় না

সুতরাং এটি দ্বিতীয়টি ব্যবহার করা ভাল ধারণা হতে পারে।


2
deleteস্পষ্টতই truncateযদিও হিসাবে একই নয় ।
জোয়েল মেলন

2
@ সুডোপোপেল এই পার্থক্যটি চিহ্নিত করতে সত্যই সহায়ক হবে। আমি আমার উত্তরে এটি যুক্ত করতে পারতাম
জিয়ানিস ক্রিস্টোফাকিস

4
ট্রলসেট কোনও লেনদেনে ব্যবহার করা যায় না, কারণ এটি রোলব্যাক দ্বারা প্রভাবিত হয় না। সেক্ষেত্রে (নতুন মাইমোডেল) -> নতুনকুইয়ারি () -> মুছুন () দিয়ে এটি অর্জন করা যায়।
হামুরাবি

12

পরোক্ষ উপায় আছে:

myModel:where('anyColumnName', 'like', '%%')->delete();

উদাহরণ:

User:where('id', 'like' '%%')->delete();

লারাভেল ক্যোয়ারী বিল্ডারের তথ্য: https://laravel.com/docs/5.4/ ক্যোয়ারী


1
@ আসচিপফ্লিল আসলে ব্যাখ্যা করার মতো বেশি নয়। কোডটি এসকিউএল চালায় DELETE FROM users WHERE id LIKE '%%'যা টেবিলের সমস্ত সারিগুলির সাথে মেলে, ফলে সমস্ত কিছু মুছে ফেলা হয়।
হংকান

এটা আমার পথে আছে। আমি আমার প্রয়োজন আইডির একটি অ্যারে পেতে অন্য মডেলটিতে একটি প্লাক () শেষ করেছি, তারপরে whereInপদ্ধতিটিটি ব্যবহার করে আমার মডেল থেকে সমস্ত রেকর্ড মুছতে সেই অ্যারেটি ব্যবহার করেছি : $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all(); ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
কীথ ডিসি

9

গুগলের মাধ্যমে যারা এই থ্রেডে যাচ্ছেন তাদের জন্য আমি আরও একটি বিকল্প যুক্ত করতে চেয়েছিলাম। আমার এটি সম্পাদন করা দরকার, তবে আমার অটো-ইনক্রিমেন্ট মান truncate()পুনরায় সেট করতে চাই। আমি DB::কিছু ব্যবহার করতে চাইনি কারণ আমি মডেল অবজেক্টটি থেকে সরাসরি পরিচালনা করতে চেয়েছিলাম। সুতরাং, আমি এটি সঙ্গে গিয়েছিলাম:

Model::whereNotNull('id')->delete();

স্পষ্টতই কলামটি অবশ্যই বিদ্যমান থাকতে হবে, তবে একটি স্ট্যান্ডার্ড, বক্স-অফ-দ্য বাক্সহীন মডেলটিতে idকলামটি বিদ্যমান এবং এটি কখনই শূন্য নয়। আমি জানি না এটি সেরা পছন্দ কিনা, তবে এটি আমার উদ্দেশ্যে কাজ করে।


Model::delete();একই জিনিস সম্পাদন করবে।
দৈর্ঘ্য

5
দুর্ভাগ্যক্রমে Model::delete()একটি ব্যতিক্রম ছুঁড়েছে Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically, কমপক্ষে লারাভেল 5.0 এ।
ডেভ জেমস মিলার

6

Model::truncate()এটি ত্রুটিযুক্ত হিসাবে আমি ব্যবহার করতে সক্ষম ছিল না :

এসকিউএলস্টেট [৪২০০০]: সিনট্যাক্স ত্রুটি বা অ্যাক্সেস লঙ্ঘন: ১1০১ বিদেশী কী সীমাবদ্ধতায় রেফারেন্সযুক্ত একটি সারণী ছাঁটাতে পারে না

এবং দুর্ভাগ্যক্রমে Model::delete()কাজ করে না (কমপক্ষে লারাভেল 5.0 এ):

অ স্থির পদ্ধতি আলোকিত \ ডাটাবেস \ স্বতন্ত্র \ মডেল :: মুছে ফেলা () স্ট্যাটিকভাবে বলা উচিত নয়, ধরে নিই um এটিকে বেমানান প্রসঙ্গ থেকে

তবে এটি কাজ করে:

(new Model)->newQuery()->delete()

যদি আপনার সফ্ট-ডিলিট সেটআপ থাকে তবে এটি সমস্ত সারিগুলিকে নরম-মুছে ফেলবে। নরম-মোছাযুক্তগুলি সহ সমস্ত সারি পুরোপুরি মুছতে আপনি এতে পরিবর্তন করতে পারেন:

(new Model)->newQueryWithoutScopes()->forceDelete()

4

এই ক্রিয়াকলাপটি সম্পন্ন করার সর্বোত্তম উপায়টি Laravel 3মনে হচ্ছে Fluentনিচের মত টেবিলটি কাটাতে ইন্টারফেসের ব্যবহার

DB::query("TRUNCATE TABLE mytable");

2

আপনি এই ওয়ান-লাইনারটি চেষ্টা করতে পারেন যা সফট-ডিলিটগুলি সংরক্ষণ করে:

Model::whereRaw('1=1')->delete();


0

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

আমি জানি কাঁচা এসকিউএল এর ব্যবহার লারভেলস সুন্দর কোড দর্শন লঙ্ঘন করে তবে এটির জায়গায় সম্ভবত শত শত প্রশ্নের পেট পেট করা শক্ত হবে।


0

একটি করতে পারেন লুপও ..

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}

প্রযুক্তিগতভাবে হ্যাঁ ... তবে আইএমও যা কিছুটা অপ্রয়োজনীয় বলে মনে হয় কারণ আরও ভাল একক ক্যোয়ারী বিকল্প রয়েছে।
পিট

@ পেট আমি জানি .. অন্যরা ইতিমধ্যে তাদের উত্তর দিয়েছে ... আমি অন্যান্য সম্ভাব্য পদ্ধতির উত্তর দেওয়ার চেষ্টা করছিলাম ..
স্যাম সলোমন

1
এটি আসলে আমার পক্ষে কাজ করে, যেমন আমি নির্দিষ্ট বিধিগুলির উপর ভিত্তি করে সংগ্রহের মডেলগুলিকে সংরক্ষণাগার তৈরি করার পরিকল্পনা করি, তবে সেইগুলি দৈনিক-সক্রিয় সারণী থেকে তাদের সাফও করি।
জেমস পেরিহ

-1

বিদেশী কী বাধাগুলির সাথে লুমেন 5.5 এর সাথে কাজ করে এমন সমাধান:

$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();

}
return response()->json(['error' => false]);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.