लारवेल एलोकेंट: सम्मिलित तालिकाओं से केवल कुछ कॉलम कैसे प्राप्त करें


102

मुझे एलोकेंट में 2 ज्वाइन टेबल दिए गए हैं, जो थीम और यूजर्स के लिए हैं।

थीम मॉडल:

public function user() {
  return $this->belongs_to('User');
}

उपयोगकर्ता मॉडल:

public function themes() {
  return $this->has_many('Theme');
}

मेरा सुवक्ता एपि कॉल नीचे जैसा दिखता है:

return Response::eloquent(Theme::with('user')->get());

जो थीम से सभी कॉलम लौटाता है (यह ठीक है), और उपयोगकर्ता से सभी कॉलम (ठीक नहीं)। मुझे केवल उपयोगकर्ता मॉडल से 'उपयोगकर्ता नाम' कॉलम की आवश्यकता है, मैं उस क्वेरी को कैसे सीमित कर सकता हूं?


मैं इसी तरह का काम कर रहा हूं, Responseक्या मुझे पता चल सकता है कि क्या मैं उस वर्ग का उपयोग कर रहा हूं जिसे मुझे आयात करने की आवश्यकता है?
एग्नेस पालिट

जवाबों:


103

अपने मॉडल को यह निर्दिष्ट करने के लिए बदलें कि आप किस कॉलम को चुनना चाहते हैं:

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

और उस कॉलम को शामिल करना न भूलें, जिस पर आप शामिल हो रहे हैं।


6
महान जवाब, यह भी शामिल होने के टिप के बारे में टिप मुझे समय की एक टन बचा लिया!
महानवितानर्थ

क्या होगा यदि कुछ स्थानों पर मुझे आईडी और उपयोगकर्ता नाम दोनों के बजाय केवल आईडी की आवश्यकता है? अभी भी दोनों का चयन करना है?
डेरियस .V

हाय, मॉडल क्वेरी बिल्डर में फ़ंक्शन का चयन समान है?
गोकिगूक्स ने

4
मुझे नहीं लगता कि यह एक अच्छा तरीका है। यह कॉलम नामों की हार्ड कोडिंग की तरह होगा। सभी स्थान केवल इन कॉलमों को वापस करेंगे। कुछ अन्य एपीआई में, मुझे कुछ और कॉलमों की आवश्यकता हो सकती है, ताकि यहां काम न हो। मुझे लगता है कि QueryBuilder का उपयोग करना यहां का विकल्प है।
अमन सूरा

2
यह एक नाटकीय तरीका है क्योंकि यह हर बार जब आप कॉल को आगे बढ़ाते हैं, तब होगा। मेरा मानना ​​है कि सज्जाद अशरफ का जवाब है कि ज्यादातर लोग इसमें दिलचस्पी लेंगे।
MMMTroy

37

लारवेल के लिए = = 5.2

-> प्लक () विधि का प्रयोग करें

$roles = DB::table('roles')->pluck('title');

यदि आप किसी एकल स्तंभ के मान युक्त सरणी को पुनः प्राप्त करना चाहते हैं, तो आप प्लक विधि का उपयोग कर सकते हैं


लारवेल के लिए <= 5.1

का प्रयोग करें -> सूचियां () विधि

$roles = DB::table('roles')->lists('title');

यह विधि भूमिका शीर्षक की एक सरणी लौटाएगी। आप लौटे हुए सरणी के लिए एक कस्टम कुंजी कॉलम भी निर्दिष्ट कर सकते हैं:


2
यह वास्तव में सवाल का जवाब नहीं है (जो विशेष रूप से जुड़ / रिश्तों के बारे में था)।
orrd

30

आप जैसे पैरामीटर में फ़ील्ड की एक सरणी की आपूर्ति कर सकते हैं:

return Response::eloquent(Theme::with('user')->get(array('user.username'));

अद्यतन (लारवेल 5.2 के लिए) डॉक्स से , आप यह कर सकते हैं:

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();

2
मैंने यह कोशिश की और यह एक त्रुटि दिखाता है SQLSTATE[42S22]: Column not foundऔर यह SQL तालिका में शामिल नहीं है with। यह त्रुटि पर दिखाई देने वाला वर्ग "SELK fk_table.column1 FROM main_table" है।
मिशेल एयर्स

1
यह "users.username" है ("user.username" नहीं)। यदि आपके पास तालिका और स्तंभ नाम आपके वास्तविक डेटाबेस से मेल खाते हैं तो उत्तर में कोड काम करेगा। इस समाधान के साथ यह नकारात्मक है, यह एलोकेंट का उपयोग करने के बजाय एक SQL क्वेरी का निर्माण कर रहा है, इसलिए नामों को आपके वास्तविक डेटाबेस तालिकाओं और स्तंभों से मेल खाना है।
orrd


16

यह मेरा इसे करने का तरीका है

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

User2317976 द्वारा पहला उत्तर मेरे लिए काम नहीं किया, मैं लार्वा 5.1 का उपयोग कर रहा हूं


2
अप टू डेट उत्तर = उपयोगी!
thesunneversets

धन्यवाद। यह मेरे लिए ठीक काम करता है। मुझे विदेशी स्टेटमेंट को चुनिंदा स्टेटमेंट में जोड़ना होगा जैसे आपने 'id' के साथ किया था अन्यथा यह अशक्त हो जाता है।
इमान सेदिघी

हालाँकि, यह अभी भी प्रत्येक परिणाम के लिए एक "पिवट" फ़ील्ड को पुनः प्राप्त करता है, जिसमें दोनों आईडी (पोस्ट_एड और श्रेणी_आईडी) सही हैं? मुझे इसकी सवारी कैसे मिल सकती है?
mayid

1
@ मीयाद आप pivotprotected $hidden = ['pivot']
सज्जाद अशरफ

यह सबसे अच्छा समाधान है (यह मानते हुए कि आप
लारवेल के

11

एक अन्य विकल्प $hiddenउन स्तंभों को छिपाने के लिए मॉडल पर संपत्ति का उपयोग करना है जिन्हें आप प्रदर्शित नहीं करना चाहते हैं। आप इस संपत्ति को अपने मॉडल पर फ्लाई या सेट डिफॉल्ट पर परिभाषित कर सकते हैं।

public static $hidden = array('password');

जब आप JSON प्रतिक्रिया वापस करते हैं, तो उपयोगकर्ता पासवर्ड छिपाया जाएगा।

आप इसे मक्खी पर भी समान तरीके से सेट कर सकते हैं।

User::$hidden = array('password');

2
Laravel 4.2 में, जब मैं इसे गतिशील रूप से सेट करने का प्रयास कर रहा हूं, तो संरक्षित संपत्ति उपयोगकर्ता :: $ छिपा हुआ नहीं हो सकता।
mtmacdonald

1
यह नहीं होना चाहिए static
स्टैकऑवरफ्लो में

@StackOverflowed, मुझे लगता है कि आप इसे किसी भी नोटिस में नहीं ले गए हैं कि यह प्रश्न / उत्तर कितना पुराना है और लारावेल 3 से संबंधित है।
जेसन लुईस

10

पेजिंग के साथ उपयोग करना

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);

6

user2317976 ने संबंधित तालिकाओं के कॉलम का चयन करने का एक शानदार तरीका पेश किया है।

यहाँ एक गतिशील चाल है जो मैंने पाया है ताकि आप मॉडल का उपयोग करते समय आप जो चाहें प्राप्त कर सकें:

return Response::eloquent(Theme::with(array('user' => function ($q) {
    $q->addSelect(array('id','username'))
}))->get();

मैंने पाया कि यह ट्रिक लोड के साथ भी अच्छी तरह से काम करता है () यह बहुत सुविधाजनक है।

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});

सुनिश्चित करें कि आप लक्ष्य तालिका की कुंजी को भी शामिल करते हैं अन्यथा यह इसे खोजने में सक्षम नहीं होगा।


6

इस तरफ:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

कृपया अपना उत्तर हमेशा स्पष्ट करें।
रोहित गुप्ता

इसी तरह की समस्या थी, यह अब तक का सबसे स्मार्ट तरीका है! यह जवाब अंडरस्टैंडिंग है!
Eldblz

यह वही उत्तर है जो पहले से ही सज्जाद अशरफ द्वारा प्रस्तुत किया गया था।
20

5

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन यदि आप एक एपीआई का निर्माण कर रहे हैं, जैसा कि प्रश्न के लेखक करते हैं, तो ऐसे कार्यों को करने के लिए आउटपुट ट्रांसफार्मर का उपयोग करें।

Transofrmer आपके वास्तविक डेटाबेस क्वेरी परिणाम और नियंत्रक के बीच एक परत है। यह आसानी से नियंत्रित करने और संशोधित करने की अनुमति देता है कि उपयोगकर्ता या एपीआई उपभोक्ता को आउटपुट क्या होने वाला है।

मैं फ्रैक्टल को आपके आउटपुट ट्रांसफ़ॉर्मेशन लेयर के ठोस आधार के रूप में सुझाता हूं । आप यहाँ दस्तावेज़ पढ़ सकते हैं ।



4

Laravel 5.5 पर, ऐसा करने का सबसे साफ तरीका है:

Theme::with('user:userid,name,address')->get()

आप एक बृहदान्त्र और उन क्षेत्रों को जोड़ते हैं जिन्हें आप अल्पविराम द्वारा अलग करना चाहते हैं और उनके बीच एक स्थान के बिना।


क्या आप जानते हैं कि हम पृष्ठांकन का उपयोग करते समय संबंधित तालिका के विशिष्ट कॉलम कैसे ला सकते हैं।
दनियाल नासिर

2

मॉडल का उपयोग करना:

Model::where('column','value')->get(['column1','column2','column3',...]);

क्वेरी बिल्डर का उपयोग करना:

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);

0

अगर मैं अच्छी तरह से समझ गया कि जो लौटा है वह ठीक है, सिवाय इसके कि आप केवल एक कॉलम देखना चाहते हैं। यदि ऐसा है तो यह बहुत सरल होना चाहिए:

return Response::eloquent(Theme::with('user')->get(['username']));

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.