2017-07-12 8 views
7

मेरी साइट पर, उपयोगकर्ता "स्थिति" पोस्ट कर सकते हैं, और अन्य उपयोगकर्ता उन स्थितियों पर उत्तर/टिप्पणी कर सकते हैं। मेरी साइट के सामने वाले पृष्ठ पर, उदाहरण के लिए, मेरे पास पिछले 3 दिनों के सबसे पसंदीदा स्थिति हैं।अधिक स्पष्ट हो रहा है Laravel में AJAX के माध्यम से कई संबंध प्रश्न?

मेरी HomeController.php में:

$statuses = Status::where('is_image', 1) 
    ->where('is_mature', 0) 
    ->where('created_at', '>=', Carbon::now()->subHours(168)) 
    ->orderBy('like_count', 'desc') 
    ->take(6) 
    ->get(); 

स्थितियां भी उत्तर हो सकता है। उत्तर स्थिति तालिका के समान तालिका का उपयोग करते हैं। उत्तर "माता-पिता" स्थिति के साथ बहुत अधिक स्थिति हैं, और नियमित स्थिति केवल "माता-पिता" के बिना स्थिति होती है।

मॉडल status.php से:

home.blade.php:

public function scopeNotReply($query) { 
    return $query->whereNull('parent_id'); 
} 

public function replies() { 
    return $this->hasMany('CommendMe\Models\Status', 'parent_id'); 
} 
तो मेरी मुख पृष्ठ पर वापस

है, तो यहां स्थितियां घर पृष्ठ पर लोड कर रहे हैं:

@if ($statuses->count()) 
    @foreach ($statuses as $status) 
     <div class="post-container"> 

     ... 

     blah blah blah 

     ... 

     @foreach ($status->replies->reverse()->slice(0, 3) as $reply) 
      <div class="status-reply-content"> 
       ... 

       blah blah blah 

       ... 
      </div> 
     @endforeach 

     @if (count($status->replies) > 3) 
      <a href="#"> 
        View More Comments ({{ count($status->replies) }}) 
      </a> 
     @endif 

     </div> 
    @endforeach 
@endif 

मैं जो चाहता हूं वह 3 टिप्पणियों के दूसरे सेट को लोड करने के लिए "अधिक टिप्पणियां देखें" बटन के लिए है।

यह आसान होगा अगर इन्हें पृष्ठित किया जा रहा था। असल में, मेरी साइट पर कहीं और मैं AJAX के माध्यम से अधिक छवियों को लोड करता हूं। इस तरह:

if($request->ajax()) { 
    return [ 
     'images' => view('browse.partials.fullview_partial')->with('images', $images->appends(request()->only('query')))->render(), 
     'next_page' => $images->nextPageUrl() 
    ]; 
}  

हालांकि यह AJAX के माध्यम से पेजिंग के अगले सेट में लोड होने पर निर्भर करता है। जबकि $status->replies संबंधों को अंकनित नहीं किया जा रहा है।

तो मैं इस परिदृश्य में और अधिक उत्तरों कैसे लोड कर सकता हूं?

संपादित करें:

यहां तक ​​कि एक वैकल्पिक समाधान भी मदद करेगा।

+0

ऐसा लगता है कि स्थिति और उत्तरों अलग-अलग तालिकाओं में संग्रहीत किए जाने पर यह बहुत आसान और अधिक तार्किक होगा। * ऐसा नहीं कर रहा है * क्या कर रहा है? मेरा मतलब है, एक "उत्तर" कभी भी अपने माता-पिता के बिना "स्थिति" नहीं होगा, इसलिए उन्हें एक साथ क्यों स्टोर करें? – DelightedD0D

+0

मैं वास्तव में इस बिंदु पर ऐसा नहीं करता। यह एक अंतिम उपाय होगा। –

+0

इसके अलावा, अगर मैं एक उत्तर तालिका बनाना चाहता था, तो भी मुझे नहीं पता कि मैं जवाबों को कैसे पगड़ सकता हूं, जब तक कि आप लार्वेल में घोंसला नहीं कर सकते? –

उत्तर

2

मैं जो कर रहा हूं वह केवल मेरे नियंत्रक में अनुरोध के लिए एक नया फ़ंक्शन बना रहा था, और उसके बाद स्थिति की आईडी भेजना, साथ ही साथ स्किप गिनती (जो कि कितने उत्तरों पहले से हैं भारित उत्तरों को छोड़ने के लिए लोड किया गया)।

public function getReplies($statusID, $skip, Request $request) { 

    $status = Status::findOrFail($statusID); 
    $replies = $status->replies()->orderBy('created_at', 'desc')->skip($skip)->take(10)->get(); 

    if($request->ajax()) { 
     return [ 
      'replies' => view('templates.partials.replies')->with('replies', $replies)->render(), 
     ]; 
    } 
} 
+1

'अगर AJAX' ब्लॉक के अंदर पूछताछ डीबी रखो। – Tpojka

5

क्या आपको उत्तर सर्वर के पक्ष के पहले पृष्ठ को लोड करने की आवश्यकता है? मुझे लगता है कि आप AJAX के साथ आने वाले पृष्ठों को लोड करने के इच्छुक हैं क्योंकि आप बस सभी क्लाइंट-साइड को संभाल सकते हैं और केवल एक AJAX एंडपॉइंट है जो डेटा प्रदान करता है।

बस स्टेटस आईडी और पेज नंबर पास करने के अपने एंडपॉइंट पर AJAX कॉल करें।

// AjaxController 
public function replies() 
{ 
    $status = Status::findOrFail(request('id')); 
    return $status->replies()->paginate(3); 
} 

(पृष्ठ संख्या स्वचालित रूप से सुलझा लिया जाएगा।)

यह paginator, जो पिछले और अगले पेज के URL, और वर्तमान पृष्ठ के लिए डेटा है की एक JSON प्रतिनिधित्व वापस आ जाएगी। फिर बस डेटा क्लाइंट-साइड प्रस्तुत करें।

+0

आपका उत्तर इसी तरह के जैसा है जिसके साथ मैं आया था। जवाब के लिए धन्यवाद! –

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