लारवेल एक रिश्ते पर आदेश देता है


116

मैं एक विशेष पोस्ट के लेखक द्वारा पोस्ट की गई सभी टिप्पणियों पर पाबंदी लगा रहा हूं।

foreach($post->user->comments as $comment)
    {
        echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

यह मुझे देता है

I love this post (3)
This is a comment (5)
This is the second Comment (3)

मैं post_id द्वारा कैसे ऑर्डर करूंगा ताकि उपरोक्त सूची 3,3,5 के रूप में आदेशित हो

जवाबों:


247

क्वेरी फ़ंक्शन के साथ संबंध को विस्तारित करना संभव है:

<?php
public function comments()
{
    return $this->hasMany('Comment')->orderBy('column');
}

[टिप्पणी के बाद संपादित करें]

<?php
class User
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

class Controller
{
    public function index()
    {
        $column = Input::get('orderBy', 'defaultColumn');
        $comments = User::find(1)->comments()->orderBy($column)->get();

        // use $comments in the template
    }
}

डिफ़ॉल्ट उपयोगकर्ता मॉडल + सरल नियंत्रक उदाहरण; टिप्पणियों की सूची प्राप्त करते समय, बस इनपुट :: get () के आधार पर ऑर्डरबी () लागू करें। (कुछ इनपुट-जाँच करना सुनिश्चित करें;))


2
किसी ने पहले से ही लारवल फोरम पर यह सुझाव दिया था, लेकिन मैं इसे नियंत्रक में करना चाहता हूं ताकि मैं यह चुन सकूं कि किस क्षेत्र को उपयोगकर्ता इनपुट के आधार पर छांटना है। हो सकता है कि मुझे इस प्रश्न में स्पष्ट करना चाहिए था।
प्रेस्टनडॉक्स

मैंने एक दूसरा उदाहरण जोड़ा है
रॉब गोर्डिजान

1
धन्यवाद रोब, आपने मुझे सही रास्ते पर डाल दिया। वास्तविक उत्तर $ टिप्पणियां = उपयोगकर्ता :: खोज (10) -> टिप्पणियां () -> ऑर्डरबाय ('पोस्ट_िड') -> प्राप्त (); काम करने के लिए इसे () विधि की आवश्यकता प्रतीत हुई। यदि आप अपने उत्तर में प्राप्त () जोड़ सकते हैं तो मैं इसे स्वीकृत उत्तर के रूप में चिह्नित करूंगा।
प्रेस्टनडॉक्स

2
यह अच्छी तरह से काम करता है यदि आप एक ही रिकॉर्ड को पुन: प्राप्त कर रहे हैं, लेकिन अगर आप एक से अधिक रिकॉर्ड को पुन: प्राप्त कर रहे हैं आप की तर्ज पर कुछ और चाहता हूँ stackoverflow.com/a/26130907/1494454
Dangel

यदि आप mysql सख्त मोड का उपयोग करते हैं, जो कि Laravel 5.4 में डिफ़ॉल्ट है, तो आप SQLSTATE प्राप्त करेंगे [42000]: सिंटैक्स त्रुटि या एक्सेस उल्लंघन: 1140 ग्रुप कॉलम का मिश्रण ...
Sabine

8

मेरा मानना ​​है कि आप भी कर सकते हैं:

$sortDirection = 'desc';

$user->with(['comments' => function ($query) use ($sortDirection) {
    $query->orderBy('column', $sortDirection);
}]);

यह आपको प्रत्येक संबंधित टिप्पणी रिकॉर्ड पर मनमानी तर्क चलाने की अनुमति देता है। आप वहां सामान रख सकते हैं जैसे:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);

1
नहीं। मैंने यह कोशिश की है, यह काम नहीं करता है। यहां मेरा मामला है: मेरे पास दो टेबल ( appointmentsऔर schedules) हैं, क्वेरी सरल है: appointmentsऑर्डर प्राप्त करें schedulesdatetimeउतरते। मैं तालिका में नया स्तंभ जोड़कर समाधान appointmentsकी दुकान में datetimeमेज से schedules। और अब मुझे केवल आदेश देना है appointmentsdatetimeमुझे पता है कि यह सबसे अच्छा तरीका नहीं है, लेकिन यह समस्या को हल करता है। XD
फेंडी सेतियावान

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