2013-12-12 8 views
9

मैं लैरवेल 4 में ऑटो वृद्धि मूल्य को रीसेट करने का एक तरीका खोजने के लिए संघर्ष कर रहा हूं लेकिन ऐसा लगता है कि यह कार्यक्षमता कम से कम अब तक लार्वेल 4 में एम्बेड नहीं है।लार्वेल उपयोगकर्ता हटाने में ऑटो वृद्धि को रीसेट कैसे करें?

$user = User::find($user_id); 

       if ($user) { 
        if ($user->delete()){ 

        DB::statement('ALTER TABLE users AUTO_INCREMENT = '.(count(User::all())+1).';'); 

        echo json_encode('User Was Deleted Successfully..'); 
        } 
      } 

हर बार मैं डेटाबेस मैं सभी उपयोगकर्ताओं +1 की संख्या के लिए ऑटो वेतन वृद्धि सूचक सेट से एक उपयोगकर्ता को हटा दें: तो मैं इसे इस तरह से किया था।

अगर किसी को है एक बेहतर समाधान मुझे सूचित करें ..

+5

रिकॉर्ड हटाने पर ऑटो वृद्धि को बदलने की कोई आवश्यकता नहीं है। – SamV

+0

ठीक है जब मेरे पास 15 उपयोगकर्ता हैं और मैं पिछले 5 को हटा दूंगा तो नए उपयोगकर्ता को 16 की आईडी सौंपी जाएगी, लेकिन मैं 10 – aimiliano

+0

से शुरू करना चाहता हूं, आप इसे फिर से शुरू क्यों करना चाहते हैं? इसके लिए कोई कार्यात्मक आवश्यकता नहीं है।यदि आप वास्तव में ऐसा करना चाहते हैं, तो आपको इसे कच्चे एसक्यूएल के साथ पहले से ही करना होगा। –

उत्तर

22

हर किसी ने कहा की तरह, वहाँ वास्तव में काउंटर वापस ले जाने के लिए जब आप एक पंक्ति को हटा एक की जरूरत नहीं है। हालांकि आप truncate एक तालिका कर सकते हैं जो सभी तालिका पंक्तियों को हटा देगा और काउंटर को रीसेट कर देगा।

आप कर सकते हैं नहीं truncate तालिका से Foreign Key Constraints उस पर लागू किया (truncate जो केवल सभी पंक्तियों को हटा देता है, जबकि ऑटो वेतन वृद्धि काउंटर रखने delete के रूप में ही नहीं है।)।

इसलिए, foreign key constrains का उपयोग करते समय, MySQL आपको उस तालिका को छूने से रोक सकता है जिसमें foreign key constraints लागू होता है।

आप जो चाहते हैं उसे प्राप्त करने के लिए आप निम्न चरणों का पालन कर सकते हैं, लेकिन सावधान रहें, आपके डेटा अखंडता का खतरा हो सकता है। मैं केवल इसे अपने परीक्षण उद्देश्यों के लिए उपयोग करता हूं।

  1. संपादित DatabaseSeeder वर्ग (जो app/database/seeds/DatabaseSeeder.php पर उपलब्ध है) इस प्रकार है: (इस मामले, जो app/database/seeds/UserTableSeeder.php पर बनाया जाना चाहिए में उदाहरण के लिए, UserTableSeeder)

    <?php 
    class DatabaseSeeder extends Seeder { 
        /** 
        * Run the database seeds. 
        * 
        * @return void 
        */ 
        public function run() 
        { 
         Eloquent::unguard(); 
    
         // Disable Foreign key check for this connection before running seeders 
         DB::statement('SET FOREIGN_KEY_CHECKS=0;'); 
    
         $this->call('UserTableSeeder'); 
         // ... 
    
         // FOREIGN_KEY_CHECKS is supposed to only apply to a single 
         // connection and reset itself but I like to explicitly 
         // undo what I've done for clarity 
         DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 
        } 
    } 
    
  2. अब टेबल बोने की मशीन कक्षाओं कर सकते हैं काट-छांट कॉल तालिका (रों) इस प्रकार है:

    <?php 
    class UserTableSeeder extends Seeder { 
    
        public function run() 
        { 
         // Truncate the table. 
         DB::table('users')->truncate(); 
    
    
         // The auto-increment has been reset. 
         // Now we can start adding users. 
         User::create(
          array(
           'email' => '[email protected]', 
           'password' => Hash::make('test') 
          ) 
         ); 
        } 
    } 
    
+0

हां यह है कि अगर मैं तालिका को छोटा करना चाहता हूं। लेकिन मैं जो चाहता था वह अगला auto_increment_value था जहां अंतिम यू_आईडी है: डी – aimiliano

+0

@aimiliano तो आप 'डीबी :: तालिका ('उपयोगकर्ता') -> हटाएं();'? :) –

+0

कोई धन्यवाद नहीं मुझे लगता है कि आप विषय से बाहर हैं! – aimiliano

1

मुझे नहीं पता कि यह स्मार्ट है या नहीं, लेकिन यह आपकी तालिका को साफ़ कर देगा।

public function cleanup($table_name) 
{  
    DB::statement("SET @count = 0;"); 
    DB::statement("UPDATE `$table_name` SET `$table_name`.`id` = @count:= @count + 1;"); 
    DB::statement("ALTER TABLE `$table_name` AUTO_INCREMENT = 1;"); 
} 

MySQL पिछले +1
आप पर अद्यतन CASCADE बच्चों परिवर्तन के बारे में जानते हैं और अद्यतन झरना करने के लिए अपने विदेशी कुंजी सेट कर लिया है AUTO_INCREMENT सेट हो जाएगा।

यह सामान सर्वर समय लेता है और आपको बदले में थोड़ा सा देता है। मुझे लगता है कि यही कारण है कि आप "अपना समय कमर नहीं करें" प्रतिक्रियाओं का भार प्राप्त कर रहे हैं? एक गिनती के लिए आपको -> गिनती() और अंतिम आईडी नहीं चाहिए।

मैं भी अगर बयान एक सौदे के भीतर होना चाहिए जब उन जोड़ रहे हैं, जबकि अपनी बयान चल रहे हैं त्रुटियों को रोकने के पता नहीं है।

+0

क्या होगा यदि कोई पूर्वनिर्धारित डेटा डालने वाले माइग्रेशन बनाने का निर्णय लेता है? यदि आप अपने माइग्रेशन को रोलबैक करते हैं, तो क्या माइग्रेशन से पहले किसी भी ऑटो डालने वाली आईडी को एक राज्य में रीसेट नहीं करना चाहिए? – georaldc

+0

@georaldc आप बीजिंग मतलब है? मुझे लार्वेल के साथ बीज का एक स्मार्ट तरीका नहीं मिला। यह एक तरीका है। यदि आप मुझसे पूछते हैं तो बीजिंग और माइग्रेशन मिलाकर परेशानी की मांग कर रही है। – Joeri

2
use Illuminate\Support\Facades\DB; 

public function refreshDB() 
{ 
    $max = DB::table('users')->max('id') + 1; 
    DB::statement("ALTER TABLE users AUTO_INCREMENT = $max"); 
} 

// Note: This solution is for resetting the auto_increment of the table without truncating the table itself 
संबंधित मुद्दे