2015-02-09 3 views
5

स्कोप जोड़ने सुवक्ता मॉडल के साथ आसान है:लार्वेल 4: डीबी :: टेबल में दायरा कैसे जोड़ें?

public function scopeMyScope($query) 
{ 
    // Do stuff to that $query 
} 

लेकिन यह कैसे DB::table के दायरे को जोड़ने के लिए?

पृष्ठ दृश्य प्राप्त करने के लिए इस क्वेरी का उपयोग करें:

$views = DB::table('page_views') 
    ->where('id', $this->id) 
    ->where('agent', 'NOT LIKE', '%bot%') 
    ->count(DB::raw('distinct session, DATE(created_at)')); 

मैं भी अन्य प्रश्नों के साथ सबसे लोकप्रिय पृष्ठों आदि दिखाने के लिए, लेकिन एक ही where शर्तों के साथ। तो मैं केवल एक बार अपने where शर्तों को परिभाषित करना चाहता हूं और उन्हें अन्य सभी पृष्ठ दृश्य DB::table प्रश्नों में पुन: उपयोग करना चाहता हूं।

उत्तर

10

DB::table में स्कॉप्स के लिए समर्थन नहीं है। आप क्या कर सकते हैं बस एक छोटा सा फ़ंक्शन लिखें जो क्वेरी के साथ कुछ चीजें करता है और इसे वापस करता है। वाक्य रचना के रूप में अच्छा नहीं है, लेकिन यह काम करता है:

function applyScope($query){ 
    $query->whereNotNull('deleted_at'); 
    $query->where('foo', 'bar'); 
    return $query; 
} 

और फिर:

$query = DB::table('page_views') 
    ->where('id', $this->id) 
    ->where('agent', 'NOT LIKE', '%bot%'); 
$query = applyScope($query); 
$views = $query->count(DB::raw('distinct session, DATE(created_at)')); 

या एक सा एक छोटा वाक्य रचना:

$views = applyScope(DB::table('page_views') 
         ->where('id', $this->id) 
         ->where('agent', 'NOT LIKE', '%bot%') 
     )->count(DB::raw('distinct session, DATE(created_at)')); 
+0

अच्छी टिप, इसने मुझे 'पृष्ठ दृश्यव्यू बिल्डर' वर्ग बनाने का विचार दिया जो 'डीबी' बढ़ाता है और इसका अपना 'टेबल' फ़ंक्शन है: '$ que ry = parent :: table ('page_views') -> जहां ('उपयोगकर्ता', शून्य) 'आदि, आदि अब इसके साथ प्रयोग कर रहे हैं। –

+1

ग्रेट! अगर आपको किसी मदद की ज़रूरत है तो मुझे बताएं :) – lukasgeiter

+0

मैंने इस [समाधान] को लागू किया (http://stackoverflow.com/a/28429629/3903565)। मुझे विचार देने के लिए धन्यवाद :) –

7

lukasgeiter answer के लिए धन्यवाद मैं का विचार आया इसके लिए एक वर्ग बनाना, जो DB बढ़ाता है और एक क्वेरी की शुरुआत देता है जिसे बनाया जा सकता है:

class PageViewQueryBuilder extends DB { 

    public static function table() 
    { 
     $query = parent::table('page_views') 
      ->where('agent', 'NOT LIKE', '%bot%') 
      ->where('agent', 'NOT LIKE', '%spider%') 
      ->where('agent', 'NOT LIKE', '%crawler%') 
      ; 

     return $query; 
    } 
} 

अब मैं कई अलग-अलग प्रश्नों को बनाने के लिए इसका उपयोग कर सकता हूं, सभी स्थितियों के साथ। किसी विशिष्ट पृष्ठ की

प्राप्त देखे जाने की संख्या:

$views = PageViewQueryBuilder::table() 
    ->where('page_id', $id) 
    ->orderBy('created_at', 'DESC') 
    ->groupBy('session', DB::raw('DATE(created_at)')) 
    ->get(); 

पिछले तीन महीनों के लिए 10 सबसे लोकप्रिय पृष्ठों प्राप्त करें::

$views = PageViewQueryBuilder::table() 
    ->selectRaw('page_id as page_id, count(distinct session, DATE(created_at)) as page_views') 
    ->whereRaw('created_at BETWEEN NOW() - INTERVAL 3 MONTH AND NOW()') 
    ->groupBy('page_id') 
    ->orderBy('page_views', 'desc') 
    ->limit(10) 
    ->get(); 

$count = PageViewQueryBuilder::table() 
    ->where('page_id', $id) 
    ->count(DB::raw('distinct session, DATE(created_at)')); 

किसी विशिष्ट पृष्ठ की सभी दृश्यों जाओ

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