2013-03-20 17 views
7

के साथ डेटा सॉर्ट करना मैं लार्वेल (सीआई से स्विच) के लिए नया हूं और कुछ समय पर ओआरएम एक रहस्य का थोड़ा सा है!Eloquent

मैं बोलने में निपुण उपयोग करते हुए मेरे db से डेटा को सॉर्ट करना चाहते हैं:

यहाँ मेरी समस्या है।

मैं एक मेज पदों और एक मेज टिप्पणी (पोस्ट कई टिप्पणियों और टिप्पणी अंतर्गत आता है है पोस्ट)

हर टिप्पणी एक टाइमस्टैम्प (=> created_at क्षेत्र) है है और मैं ऑर्डर करना है इस प्रकार बातें:

(हम प्रोफाइल इतना $ उपयोगकर्ता- पर हैं> आईडी उपयोगकर्ता (की आईडी जाहिर है))

मैं पदों जहां इस उपयोगकर्ता एक टिप्पणी और आदेश दिया से प्रत्येक पोस्ट चाहते हैं बनाई गई सभी पोस्ट द्वारा बनाई गई टिप्पणी के क्षेत्र में

मैं वास्तव में पूरी तरह से, या कम से कम फ्लुएंट का उपयोग करना चाहता हूं, और मुझे ऐसा करने का सही तरीका नहीं पता है।

मुझे उम्मीद है कि मैं स्पष्ट हूं, और आपके समय के लिए धन्यवाद!

उत्तर

13

मैं बस एक परियोजना पर एक ही समस्या में भाग गया जो मैं विकसित कर रहा हूं।हर जगह मैंने देखा कि मैंने usort() या uasort() को इस समस्या को हल करने के लिए सुझाए गए तरीके के रूप में देखा था। (Collection::sort()uasort() के लिए सिर्फ एक रैपर है) लेकिन इससे मुझे संतुष्ट नहीं हुआ क्योंकि मैं PHP का उपयोग क्यों करूंगा जब एसक्यूएल को मेरे द्वारा ऑर्डर द्वारा ऑर्डर किया जाना चाहिए ??? मैं इसे इस तरह से एक getXXXAttribute() विधि का उपयोग कर लागू करने समाप्त हो गया:

class Post extends Eloquent { 
    public function comments() 
    { 
     return $this->hasMany('Comment'); 
    } 

    public function getCommentsAttribute() 
    { 
     $comments = $this->comments()->getQuery()->orderBy('created_at', 'desc')->get(); 
     return $comments; 
    } 
    ... 
} 
+0

क्या यह टिप्पणी या पोस्ट को सॉर्ट करता है? –

+0

ऐसा लगता है कि यह टिप्पणी करता है ... –

+2

समाधान पुराना प्रतीत होता है। पता नहीं जब उन्होंने वास्तव में इसे लागू किया, लेकिन आप क्वेरी कार्यों के साथ संबंध बढ़ा सकते हैं। तो इस मामले में आप केवल लिख सकते हैं 'यह $ $ -> है कई (' टिप्पणी ') -> ऑर्डरबी (' create_at ',' desc ') '। [Credt] (http://stackoverflow.com/questions/18143061/laravel-orderby-on-a-relationship) – mwallisch

1

ऐसा कुछ मदद कर सकता है।

$content = Posts::with(array('comments' => function($query) { 
       $query->order_by('created_at', 'asc'); 
      })) 
      ->get(); 

या यदि आपकी समस्या को और अधिक जटिल है:

How to sort by a field of the pivot table of a many-to-many relationship in Eloquent ORM

+0

आपके समय के लिए धन्यवाद लेकिन यह काम नहीं करता है: ऐसा इसलिए है क्योंकि क्वेरी पोस्ट को फ़िल्टर नहीं करती है लेकिन टिप्पणी। नतीजा यह है कि, मुझे अपनी सभी पोस्ट मिलती हैं, और इसे हल नहीं किया जाता है। लार्वेल में इतनी सरल कार्रवाई कैसे आती है? मैंने फ्लुएंट का उपयोग करने की कोशिश की, लेकिन मुझे यह स्वीकार करना है कि मुझे इससे नफरत है ... क्या आपके पास कोई और विचार है? –

0

जिस समस्या का सामना कर रहे हैं क्योंकि रिश्ता है कि आपके द्वारा निर्धारित केवल आपके टिप्पणियां कि साथ जुड़े रहे हैं दे रहा है पोस्ट और एक "ऑर्डर बाय" उस परिणाम पर सिर्फ टिप्पणियों को सॉर्ट करेगा क्योंकि टिप्पणियां क्या हो रही हैं, इसलिए आप क्या कर सकते हैं यह भी परिभाषित करता है कि टिप्पणियां मॉडल में "टिप्पणियां" "पोस्ट" से संबंधित हैं और फिर खोजें टिप्पणी पोस्ट करें और फिर मैन्युअल तुलना चलाने के लिए usort() फ़ंक्शन का उपयोग करें mple (मैं Laravel 3 में कोड लिख रहा हूँ, लेकिन आप कर सकता है किसी अन्य संस्करण के लिए इसे फिर से लिखना) किया जाएगा:

तो, मान लें कि आपकी टिप्पणियाँ तालिका जो के साथ संबंध को परिभाषित करता है postid नामक एक विदेशी कुंजी है कि पोस्ट मेज और पोस्ट तालिका में समय-चिह्न डिफ़ॉल्ट created_at है और उपयोगकर्ता तालिका विदेशी कुंजी userid साथ टिप्पणियां तालिका से जुड़ा है,

$userid = $user->id; 
    $comments = Comments::where_userid($userid); 
    function commentsort($first, $second){ 
     if (getCommentPost($first) == getCommentPost($second)) { 
     return 0; 
     } 
    return (getCommentPost($first) < getCommentPost($second)) ? -1 : 1; 
    } 

    function getCommentPost($comment){ 
    return Post::where_postid($comment->postid)->first()->created_at; 
    } 

    usort($comments, "commentsort"); 

मदद करनी चाहिए यही कारण है कि इसे ठीक है, वास्तविकता यह में लार्वेल में शामिल नहीं है क्योंकि यह एक ढांचा और कार्य है जो विशिष्ट कार्यों को निष्पादित करते हैं उन्हें आम तौर पर ढांचे में शामिल नहीं किया जाता है क्योंकि उपयोग का सीमित दायरा होता है, कहा जा रहा है कि आप इस कार्य को डिफ़ॉल्ट डीबी कक्षा में भी शामिल कर सकते हैं ताकि परियोजना में सार्वभौमिक रूप से इस कार्यक्षमता का उपयोग किया जा सके।

2

मुझे पहले भी यही समस्या थी लेकिन यह एक-से-एक संबंध था। यह post मेरी मदद की। मैं एक जॉइन का उपयोग कर समाप्त हो गया। मेरा कोड इस तरह था:

$data = Posts::join('comments', 'comments.post_id', '=', 'posts.id') 
     ->order_by('comments.created_at') 
     ->get(array('comments.field1 as field1', 'posts.field2 as field2')); 
1

आप रिश्ते अपने उपयोगकर्ता वर्ग में परिभाषित किया गया है तो आप टिप्पणियों के माध्यम से सभी पोस्ट प्राप्त कर सकते हैं। यह एक संग्रह देता है जो sortBy() और sortByDesc() फ़ंक्शंस प्रदान करता है। इन दोनों कार्यों में एक कॉलबैक स्वीकार किया जाएगा जहां आप स्वयं को सॉर्ट विधि चुन सकते हैं।

$posts = $user->comments->post->sortByDesc(function($post) { 
    return $post->created_at; 
}); 
संबंधित मुद्दे