2015-01-21 7 views
9

द्वारा संग्रह से आइटम को कैसे निकालें मैं अपने संग्रह से व्यवस्थापक उपयोगकर्ता को हटाना चाहता हूं। मुझे पता है कि तालिका (आईडी) में प्राथमिक कुंजी 1 है। लेकिन जब मैं forget(1) का उपयोग करता हूं तो यह 0 से शुरू होने वाले संग्रह में सरणी तत्व को हटा देता है। मैं आईडी से संग्रह से आइटम को कैसे हटा सकता हूं?लार्वेल: आईडी

// Grab all the users 
    $users = User::all(); //$this->user; use to return array not Laravel Object 
    if($users->find(1)->hasRole('admin')) 
     $users->forget(0); 
+0

आप मतलब है, आप नहीं है कि डेटाबेस से हटाना चाहते हैं:

तो तुम जैसे कुछ लिख सकते हैं (बुरा उदाहरण के बारे में खेद है, मेरे अपने उपयोग के मामले दूसरों के लिए उपयोगी होने के लिए भी अलग है) सिर्फ $ उपयोगकर्ता संग्रह से? –

+0

हां। मैं अपने उपयोगकर्ता पर उपयोगकर्ताओं की सूची में व्यवस्थापक उपयोगकर्ता को प्रदर्शित नहीं करना चाहता हूं। – Phil

+0

संभावित डुप्लिकेट [भूलना काम नहीं करता] [http://stackoverflow.com/questions/20735181/forget-doesnt-work) – ceejayoz

उत्तर

13

संग्रह से किसी आइटम को हटाने की कोशिश करने के बजाय, इसे पहले स्थान पर कभी भी चुनना बेहतर होगा।

आप इस तरह अपने डीबी क्वेरी के लिए एक बाधा जोड़ सकते हैं:

$users = User::where('role', '!=', 'admin')->get(); 

(यह कैसे भूमिकाओं अपने स्कीमा में परिभाषित कर रहे हैं पर निर्भर करता है थोड़ा अलग हो सकता है)।

तो आपको एक अलग roles मेज और user_role तालिका के साथ एक अधिक जटिल स्कीमा का उपयोग कर रहे हैं, तो आप इस तरह क्वेरी कर सकते हैं:

$users = User::whereHas('roles', function($q){ 
    $q->where('role', '!=', 'admin'); 
})->get(); 

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

$usersWithoutAdmins = $users->filter(function($user) 
{ 
    return !$user->hasRole('admin'); 
}); 
+1

आईडी के बजाय तत्व की जांच करने के लिए '$ उपयोगकर्ताओं-> $ (0] '' 'उपयोगकर्ताओं' के साथ' 1 उपयोगकर्ता-> ढूंढें (1) 'को बदल दिया है। मैं Confide/Entrust का उपयोग कर रहा हूं जो आपके दूसरे समाधान के अनुरूप होगा, सिवाय इसके कि यह 'भूमिकाओं 'के बजाय कॉलम' नाम' का उपयोग करता है। समाधान उन उपयोगकर्ताओं का चयन नहीं करता है जिनके पास कोई भूमिका नियुक्त नहीं है ... मुझे उन सभी उपयोगकर्ताओं को भूमिका निभाने की आवश्यकता होगी जो मुझे शायद किसी भी तरह से करना चाहिए ... इसलिए मुझे जो चाहिए वह बहुत अधिक है लेकिन ओह ठीक है। मुझे उम्मीद है कि मुझे ऐसा करने में लंबा समय नहीं लगेगा। – Phil

+0

मुझे कन्फाईड/एंट्रस्ट के साथ भूमिका को बचाने के लिए प्रयास करने में बहुत कठिनाई आई है ... कृपया देखें [लारवेल-कैसे-क्वेरी-टू-गेट-ऑल-रिकॉर्ड्स-सिवाय-जहां-रिलेशन-है-नाम-कॉलम ] http://stackoverflow.com/questions/28095206/laravel-how-to-query-to-get-all-records-except-where-relation-has-name-column यदि आप जानते हैं कि अपना दूसरा कैसे करें क्वेरी आपने मुझे उन उपयोगकर्ताओं को प्राप्त करने के लिए दिखाया जिनके पास कोई भूमिका नहीं है। – Phil

14

के रूप में इस तरह के bencohenbaritone के जवाब इस समस्या को हल करने के लिए बेहतर तरीका है, मुझे लगता है कि Laravel सुवक्ता संग्रह जोड़ने के लिए विधि except() है, जो प्राथमिक कुंजीforget() के बजाय संग्रह से eloquent वस्तुओं को हटा सकता है। उत्तरार्द्ध संग्रह सूचकांक कुंजी (जैसे array[i]) द्वारा हटाया जाता है और प्राथमिक कुंजी द्वारा नहीं।

$admin_user_id = 20; 
$users = User::all(); 
$users_without_admin = $users->except($admin_user_id); 
+0

इससे मेरी मदद मिली, क्योंकि मेरे पास ऐसी स्थिति है कि मैं डेटाबेस-केवल क्वेरी के साथ ठीक से नहीं कर सकता और यह केवल टिकट था! – mydoglixu