2014-05-12 16 views
16

का उपयोग करते समय प्रमाण पत्र कॉलम को बहिष्कृत करने के लिए कैसे करें जब मैं उच्चारण का उपयोग कर रहा हूं, तो मैं "कहां" विधि का उपयोग कर सकता हूं, फिर उस विधि को भरने के लिए 'get' विधि का उपयोग कर सकता है जिसमें मैंने अपने डेटाबेस में चुना है। मेरा मतलब है:eloquent

$users = User::where('gender', 'M')->where('is_active', 1)->get(['pseudo', 'email', 'age', 'created_at'])->toArray(); 

यहाँ मैं कॉलम मैं 'छद्म', 'ई-मेल', आदि .. लेकिन क्या मैं laravel दस्तावेज़ में याद आती है की तरह प्राप्त करना चाहते हैं जिस तरह से विपरीत करने के लिए है चुन सकते हैं।

$users = User::where('gender', 'M')->where('is_active', 1)->notGet(['pseudo', 'email', 'age', 'created_at'])->toArray(); 

जवाब futur आप के लिए धन्यवाद और आपका दिन शुभ हो: यह ऐसा ही कुछ हो सकता है।

+0

सवाल यह है कि, आप ऐसा क्यों करना चाहते हैं? ओआरएम का उपयोग करके आप इसे नहीं करेंगे, और यदि आप कुछ कॉलम दिखाना नहीं चाहते हैं, तो इसे प्राप्त करने के अन्य तरीके भी हैं। –

+2

मैं इसे पूछता हूं क्योंकि जब आपके पास 15 कॉलम होते हैं और आप 13 चाहते हैं, तो ऐसा कुछ करने के लिए तेज़ हो सकता है -> नॉट (['कॉलम 14', 'कॉलम 15']); इसके बजाय -> प्राप्त करें (['कॉलम 1', 'कॉलम 2', [...], 'कॉलम 13']); आप देखते हैं? – Brazeredge

+0

आप समझ में नहीं आये, मैंने पूछा क्यों? जब तक यह वाक्प्रचार से संबंधित नहीं है। –

उत्तर

25

AFAIK स्पष्ट रूप से कॉलम को बाहर करने के लिए SQL में विकल्प में कोई निर्माण नहीं है, इसलिए लैरवेल इसे नहीं कर सकता है। लेकिन तुम this trick

कोशिश कर सकते हैं अद्यतन एक और चाल आप कर सकते हैं अपने मॉडल

protected $columns = array('id','pseudo','email'); // add all columns from you table 

public function scopeExclude($query,$value = array()) 
{ 
    return $query->select(array_diff($this->columns,(array) $value)); 
} 

तब के सभी कॉलमों निर्दिष्ट करने के लिए है:

$users = User::where('gender', 'M')->where('is_active', 1)->exclude(['pseudo', 'email', 'age', 'created_at'])->toArray(); 
+0

-> बहिष्कृत करें? इसके परिणामस्वरूप विधि की अनुमति नहीं होगी। – Leon

+1

@Leon उपरोक्त मॉडल फ़ंक्शन 'scopeExclude()' को इस तरह कहा जाता है। Https://laravel.com/docs/5.3/eloquent#local-scopes पर लार्वेल स्कॉप्स के बारे में पढ़ें – cari

+0

यह विधि काम नहीं करती है जब [उत्सुक रिलेशनशिप लोडिंग] के साथ जंजीर होती है (https://laravel.com/docs/5.4/eloquent -संबंधों # उत्सुक-लोडिंग): मॉडल खुद को बिना किसी अपरिचित लोगों के सही कॉलम देता है, लेकिन संबंधों को पुनर्प्राप्त करने में विफल रहता है। –

2

आप hidden सरणी का उपयोग कर सकते इस तरह:

class Promotion extends Model 
{ 
    protected $table = 'promotion'; 
    protected $hidden = array('id'); 
} 
14

मैं पिछले Laravel संस्करण के बारे में पता नहीं है, लेकिन 5.4 में आप उपयोगकर्ता मॉडल में इस लाइन डाल सकते हैं

protected $hidden = ['pseudo', 'email', 'age', 'created_at']; 

और फिर

User::find(1); 

pseudo छोड़कर सभी क्षेत्रों वापस आ जाएगी, email , age, और created_at

लेकिन आप अभी भी उपयोग कर रहा

$user = User::find(1); 
$email = $user['email']; 
+1

लार्वेल 5.1 – Bugfixer

0

हम सभी क्षेत्रों के साथ पूरा मॉडल से वस्तु वाक्पटु प्राप्त करके उन छुपी फ़ील्ड प्राप्त कर सकते हैं, यह सरणी को बदलने और हम इसे एक संग्रह के अंदर डाल दिया। सरणी $ फ़ील्ड में निर्दिष्ट सभी फ़ील्ड को छोड़कर हम सभी फ़ील्ड प्राप्त करते हैं।

$fields = ['a', 'b', 'c', 'N']; 
$object = Model::find($id); 
return collect($object->toArray())->except($fields); 

अधिक स्पष्ट रूप से, चलो एक उदाहरण देता है:

// Array of fields you want to remove 
$fields_to_remove = ['age', 'birthday', 'address']; 

// Get the result of database 
$user = User::find($id); 

// Transform user object to array 
$user = $user->toArray(); 

// Create a collection with the user inside 
$collection = collect($user); 

// Get all fields of our collection except these fields we don't want 
$result = $collection->except($fields_to_remove); 

// Return 
return $result; 

इस उदाहरण से ऊपर पहले एक के बिल्कुल वही बात करता है, लेकिन इसे और अधिक विस्तार से बताया है।

+2

में भी उपलब्ध है यह आपके उत्तर में कुछ स्पष्टीकरण जोड़ना बेहतर है। – Ibo

+1

हे @ इबो पहले से ही यह किया है। कृपया फिर से सत्यापित करें। –

संबंधित मुद्दे