लारवेल एलेक्वेंट क्वेश्चन (या क्वेरी बिल्डर का उपयोग करके) में एक टेबल को कैसे उर्फ ​​करें?


147

आओ हम कहते हैं कि हम लारवेल के क्वेरी बिल्डर का उपयोग कर रहे हैं:

$users = DB::table('really_long_table_name')
           ->select('really_long_table_name.id')
           ->get();

मैं इस एसक्यूएल के बराबर देख रहा हूँ:

really_long_table_name AS short_name

यह विशेष रूप से तब मददगार होगा जब मुझे बहुत सारे चयन और व्हाट्सएप टाइप करने होंगे (या आम तौर पर मैं उपनाम को चयन के कॉलम उर्फ ​​में शामिल करता हूं, और यह परिणाम सरणी में उपयोग किया जाता है)। किसी भी टेबल एलियसेस के बिना मेरे लिए बहुत अधिक टाइपिंग है और सब कुछ बहुत कम पठनीय बन जाता है। लारवल डॉक्स, किसी भी विचार में जवाब नहीं मिल सकता है?

जवाबों:


218

Laravel तालिकाओं और स्तंभों के साथ उपनामों का समर्थन करता है AS। प्रयत्न

$users = DB::table('really_long_table_name AS t')
           ->select('t.id AS uid')
           ->get();

आइए इसे एक भयानक tinkerउपकरण के साथ कार्रवाई में देखें

$ php कारीगर टिंकर
[१]> स्कीमा :: क्रिएट (] रियली_लंग_टेबल_नाम ’, फंक्शन ($ टेबल) {$ टेबल-> इंक्रीमेंट (re आईडी’);});
// शून्य
]
// सच
]
// सरणी (
// 0 => ऑब्जेक्ट (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo मुझे पता है। मेरा मानना है कि आप laravel मंचों में अनुरोध के साथ टिप्पणी छोड़ सकता है forums.laravel.io
peterm

2
@AldiUnanto अभिजात वर्ग के बारे में क्या? एक मेज पर सक्रिय रिकॉर्ड का मतलब है, इसलिए आपको उपनाम की आवश्यकता नहीं है। जब आप उन संबंधों का उपयोग करते हैं जो आप अभी भी एक समय पर एक तालिका के साथ काम कर रहे हैं (यानी जब आप रिश्ते पर फ़िल्टर परिभाषित करते हैं)। अब यदि आप क्वेरी बिल्डर को एलोकेंट मॉडल (यानी ज्वाइन) के साथ उपयोग कर रहे हैं, तो आप सभी सम्मिलित तालिकाओं पर उपनाम का उपयोग कर सकते हैं, लेकिन मॉडल तालिका।
पेटर्म

1
@peterm अगर मैं वाक्पटु में क्वेरी बिल्डर का उपयोग करता हूं तो क्या होगा? मेरा मतलब है कि वाक्पटु मॉडल को तालिका के नाम (जैसे protected $table = "books";) के लिए संरक्षित संपत्ति घोषित करने की आवश्यकता है फिर मैं एक उपनाम कैसे बना सकता हूं? (उदाहरण के लिए उत्पन्न एसक्यूएल: ... FROM books AS A ...)
Aldi Unanto

आप कर सकते हैं, protected $table = 'really_long_table_name AS short_name';लेकिन यह INSERTs पर विफल होगा। रिश्ते के सवालों को भी तोड़ सकता है। मैं ल्युकेन और डीडीडी / रिपोजिटरी पैटर्न का उपयोग कर रहा हूं ताकि एलोकेंट से पूरी तरह बचा जा सके।
प्राग्मैमर

@peterm मैं एलोकेंट उर्फ ​​के साथ भी फंस गया हूं। क्या आप को एलोक्वेंट के साथ कुछ मिला?
लिजेश शाक्य

77

एलोकेंट मॉडल पर उपनाम का उपयोग करने के लिए अपने कोड को इस तरह संशोधित करें:

Item
    ::from( 'items as items_alias' )
    ->join( 'attachments as att', DB::raw( 'att.item_id' ), '=', DB::raw( 'items_alias.id' ) )
    ->select( DB::raw( 'items_alias.*' ) )
    ->get();

यह स्वचालित रूप से तालिका नामों में तालिका उपसर्ग जोड़ देगा और Itemsमॉडल का एक उदाहरण देता है । एक नंगे क्वेरी परिणाम नहीं। जोड़ने DB::rawसे लार्वा को एलियास में तालिका उपसर्ग जोड़ने से रोकता है।


1
@ m3rg क्या आपने कभी इसे नरम हटाने के साथ काम करने का एक तरीका पाया है? क्वेरी त्रुटि के साथ विफल हो जाती हैUnknown column 'table_alias.deleted_at'
dev7

इस स्थिति के बारे में कैसे? का चयन करें * से fx_bank के रूप में एक ठीक संत शामिल हों fx_ex_keys के रूप में b पर b.bank_id = a.id और a.agent_type = 2 WHERE b.status = 1 और bgroup = -1;
GFxJamal

@jRhesk तालिका उपनामों को लक्षित करने के लिए DB :: कच्चे हर जगह का उपयोग करें। अन्य
लारवेल

@ m3rg @ यानि मैं इसका इस्तेमाल करता हूं ->withTrashed()और->whereNull('table_alias.deleted_at')
हिदायत

8

यहाँ है कि यह कैसे कर सकता है। मैं इसमें शामिल होने के साथ एक उदाहरण दूंगा ताकि यह किसी के लिए स्पष्ट हो जाए।

$products = DB::table('products AS pr')
        ->leftJoin('product_families AS pf', 'pf.id', '=', 'pr.product_family_id')
        ->select('pr.id as id', 'pf.name as product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

उम्मीद है की यह मदद करेगा।


क्या आप एक उदाहरण प्रदान कर सकते हैं जिसमें उर्फ ​​अंडरस्कोर (_) के बजाय व्हाट्सएप है?
चन्नोक्स

7

एलोकेंट में उपयोग करने के लिए। अपने मॉडल के शीर्ष पर जोड़ें

protected $table = 'table_name as alias'

// table_name आपके डेटाबेस में जैसा होना चाहिए वैसा ही होना चाहिए

.. जैसे आपकी क्वेरी में उपयोग करें

ModelName::query()->select(alias.id, alias.name)


1
लारवेल बहुत खराब डिजाइन, उर्फ ​​आप ऑपरेशन क्वेरी के लिए ठीक ऊपर परिभाषित करते हैं, लेकिन अद्यतन और हटाए जाने की वजह से त्रुटि होगी।
उपाय

1

आप इसे लिखते हुए कम कोड का उपयोग कर सकते हैं:

    $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name'));

और निश्चित रूप से यदि आप अधिक क्षेत्रों का चयन करना चाहते हैं, तो बस "," लिखें और अधिक जोड़ें:

 $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name', 'really_long_table_name.another_field as other', 'and_another'));

जब आप किसी जटिल क्वेरी का उपयोग करते हैं तो यह बहुत ही व्यावहारिक है


0

एएमआईबी के उत्तर के रूप में, सॉफ्ट डिलीट एरर के लिए "अज्ञात कॉलम 'table_alias.deleted_at'", बस जोड़ें ->withTrashed()फिर अपने आप को संभालें जैसे->whereRaw('items_alias.deleted_at IS NULL')

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