एलोकेंट का उपयोग करके तालिका में सभी पंक्तियों को कैसे हटाएं?


135

मेरा अनुमान निम्नलिखित सिंटैक्स का उपयोग करना था:

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

लेकिन वह काम नहीं आया। मुझे यकीन है कि यह सुपर सरल है, लेकिन मैंने इस विषय पर प्रलेखन के लिए खोज की है और यह नहीं मिल सकता है!

जवाबों:


279

कारण MyModel::all()->delete()काम नहीं करता है क्योंकि all()वास्तव में क्वेरी बंद हो जाती है और एलोकेंट ऑब्जेक्ट्स का संग्रह लौटाता है।

आप ट्रंकट विधि का उपयोग कर सकते हैं, यह लारवेल 4 और 5 के लिए काम करता है:

MyModel::truncate();

वह अलग-अलग पंक्ति विलोपन को लॉग किए बिना तालिका से सभी पंक्तियों को छोड़ देता है।


1
मैंने भविष्य के पाठकों के लिए अपने प्रश्न के लिए एक लार्वा 3 समाधान जोड़ा है।
पीट

39
अच्छा लगा। यह 2016 में
लारवेल

14
नोट: ट्रंकट () भी किसी भी AUTO_INCREMENT काउंटर को रीसेट करता है (यह भी नोट करें कि आप उन टेबल को काट नहीं सकते हैं जिनमें विदेशी कुंजी बाधाएं हैं।)
विलियम टरेल

10
FYI करें: Turncate डिलीट इवेंट्स को ट्रिगर नहीं करेगा।
फ़्यूज़न

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 () का उपयोग कर सकते हैं।
केविनएल्बस

यदि आप चाहते हैं कि यह भी संबंधित तालिकाओं को हटा नहीं है।
तेरेज नेस्टस

यह सभी रिकॉर्ड्स को डिलीट कर देगा, भले ही सॉफ्ट डिलीट ऑन या ऑफ हो
Shalini

मॉडल :: whereNotNull ( 'आईडी') -> हटाना (); - मुलायम
शालिनी

61

Model::truncate()यदि आप अक्षम करते हैं तो आप उपयोग कर सकते हैं foreign_key_checks(मुझे लगता है कि आप MySQL का उपयोग करते हैं)।

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


आप स्कीमा का उपयोग भी कर सकते हैं :: disableForeignKeyConstraints (); & स्कीमा :: enableForeignKeyConstraints ();
एलियाजर रेसेंडेज़

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
@sudopeople यह अंतर को इंगित करने के लिए वास्तव में उपयोगी होगा। मैं इसे अपने उत्तर में भी जोड़ सकता था
गियान्निस क्रिस्तोकिस

4
TRUNCATE का उपयोग लेन-देन में नहीं किया जा सकता है, क्योंकि यह रोलबैक से प्रभावित नहीं है। उस स्थिति में, यह (नया MyModel) -> newQuery () -> हटाना () के साथ प्राप्त किया जा सकता है।
हम्मूराबी

12

एक अप्रत्यक्ष तरीका है:

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

उदाहरण:

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

लारवेल क्वेरी बिल्डर जानकारी: https://laravel.com/docs/5.4/queries


1
@aschipfl वास्तव में समझाने के लिए ज्यादा नहीं है। कोड SQL को चलाता है DELETE FROM users WHERE id LIKE '%%'जो तालिका में सभी पंक्तियों से मेल खाता है, इस प्रकार सब कुछ हटा रहा है।
हांक नोव

यह मुझे अपने रास्ते पर मिल गया। मैंने आईडी की एक सरणी प्राप्त करने के लिए दूसरे मॉडल पर एक प्लक () करने के लिए समाप्त किया, फिर उस सरणी का उपयोग करके अपने मॉडल से सभी रिकॉर्ड को whereInविधि से हटाने के लिए उपयोग किया : $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all(); ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
कीथ डीसी

9

मैं Google के माध्यम से इस थ्रेड के लिए एक और विकल्प जोड़ना चाहता था। मुझे इसे पूरा करने की आवश्यकता थी, लेकिन मेरे ऑटो-इंक्रीमेंट मूल्य को बरकरार रखना चाहता था जो 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()त्रुटि के रूप में उपयोग करने में सक्षम नहीं था :

SQLSTATE [42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1701 एक विदेशी प्रमुख बाधा में संदर्भित तालिका को काट नहीं सकता

और दुर्भाग्य से Model::delete()काम नहीं करता है (कम से कम लारवेल 5.0 में):

गैर-स्थैतिक विधि को प्रकाशित करें \ Database \ Eloquent \ Model :: delete () को असंगत संदर्भ से $ यह मानते हुए वैधानिक रूप से नहीं कहा जाना चाहिए

लेकिन यह काम करता है:

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

यदि आपके पास सॉफ्ट-डिलीट सेट अप है, तो सभी पंक्तियों को सॉफ्ट-डिलीट कर देगा। नरम-हटाए गए सहित सभी पंक्तियों को पूरी तरह से हटाने के लिए आप इसे बदल सकते हैं:

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

4

इस ऑपरेशन को पूरा करने का सबसे अच्छा तरीका यह Laravel 3है कि Fluentइंटरफ़ेस का उपयोग तालिका को नीचे दिखाने के लिए किया जाए

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

2

आप इस एक-लाइनर को आज़मा सकते हैं जो सॉफ्ट-डिलीट को भी संरक्षित करता है:

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


0

ट्रैविस विग्नन के उत्तर के समान नस में, मुझे एलोक्विंट मॉडल से डेटा की आवश्यकता थी, और यदि स्थिति सही थी, तो मुझे मॉडल को हटाने या अपडेट करने की आवश्यकता थी। मैं न्यूनतम और अधिकतम प्राप्त कर रहा हूं, मैं अपनी क्वेरी द्वारा वापस आ गया हूं (यदि कोई अन्य फ़ील्ड एक तालिका SQL क्वेरी के माध्यम से फ़ील्ड को अद्यतन करने के लिए मूल चयन मानदंड के साथ मेरे चयन मानदंड को पूरा करेगी) संग्रह में प्रति वस्तु एक स्पष्ट क्वेरी का विरोध)।

मुझे पता है कि कच्चे एसक्यूएल के उपयोग से लार्वा सुंदर कोड दर्शन का उल्लंघन होता है, लेकिन एक के स्थान पर संभवतः सैकड़ों प्रश्नों का पेट भरना मुश्किल है।


0

कर सकते हैं a पाश भी ।।

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}

तकनीकी रूप से हाँ ... लेकिन बेहतर सिंगल क्वेरी विकल्प होने के बाद IMO थोड़ा अनावश्यक लगता है।
पीट

@ मुझे पता है .. दूसरों ने पहले से ही अपने जवाब दिए ... मैं करने के लिए अन्य संभावित विधि का उत्तर देने की कोशिश कर रहा था ..
सैम सोलोमन

1
यह वास्तव में मेरे लिए काम करता है, जैसा कि मैं विशिष्ट नियमों के आधार पर संग्रह में मॉडल को संग्रहित करने की योजना बना रहा हूं, लेकिन उन्हें उस दैनिक-सक्रिय तालिका से भी साफ़ कर रहा हूं।
जेम्स पेरीह

-1

समाधान जो विदेशी कुंजी बाधाओं के साथ लुमेन 5.5 के साथ काम करता है:

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

}
return response()->json(['error' => false]);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.