2015-08-13 17 views
6

Tôi hơi bị mắc kẹt trên thứ gì đó thường khá thẳng về phía trước. Tôi cần sắp xếp các bản ghi từ mối quan hệ hasMany thành một thứ tự tùy chỉnh dựa trên một giá trị nhất định và một mảng 'sắp xếp thứ tự'.Phân loại tùy chỉnh trên bộ sưu tập mối quan hệ laravel

Mã của tôi bên dưới không hoạt động vì tôi đang chuyển uSort() một bộ sưu tập hùng hồn và tôi không chắc chắn cách thực hiện.

$go = $this->hasMany('Product')->orderBy('colour','DESC'); 

$order = array('RED', 'GREEN', 'BLUE', 'YELLOW'); 

usort($go, function ($a, $b) use ($order) { 
    $pos_a = array_search($a->colour, $order); 
    $pos_b = array_search($b->colour, $order); 
    return $pos_a - $pos_b; 
}); 

return $go; 

Có thể tôi đang thiếu một số trợ giúp ma thuật tuyệt vời, nhưng tôi bị kẹt. Bất kỳ suy nghĩ hay lời khuyên nào sẽ được đánh giá cao!

Cheers

+0

Bạn có thể xin vui lòng gửi cấu trúc mảng của '$ go' giống như' print_r ($ go) 'cùng với đầu ra mong đợi –

Trả lời

5

Các usort tương đương cho Collectionsort() phương pháp. Phải gọi lại như một tham số và trả về bộ sưu tập được sắp xếp.

Vì vậy, trong trường hợp của bạn, giải pháp là:

$go = $go->sort(function ($a, $b) use ($order) { 
    $pos_a = array_search($a->colour, $order); 
    $pos_b = array_search($b->colour, $order); 
    return $pos_a - $pos_b; 
}); 
+0

Điều này đã làm việc sau khi di chuyển nó ra ngoài định nghĩa mối quan hệ, vì các hàm quan hệ phải trả về một mối quan hệ. Cảm ơn ví dụ tuyệt vời! –

1

sắp xếp của bạn sẽ được áp dụng sau khi bạn nhận được kết quả trong khi đây $go = $this->hasMany('Product')->orderBy('colour','DESC'); bạn chỉ nhận được một thể hiện của một lớp mà sẽ trở lại có thể trở lại kết quả của bạn nếu bạn áp dụng phương thức get trên đó.

Đối với mục đích của bạn, bạn phải sử dụng sortBy method của laravel collections sau khi bạn nhận được kết quả của dữ liệu của bạn, bạn có thể tìm thêm (laravel Collection sortBy() method) & đây là một câu trả lời câu hỏi tương tự cho bạn https://stackoverflow.com/a/28202985

+0

Cảm ơn thông tin về việc áp dụng điều này bên ngoài chức năng quan hệ. Giữa bạn và jedrzej bạn đã giải quyết được vấn đề của tôi, cổ vũ! –

Các vấn đề liên quan