Lệnh Laravel


116

Tôi đang lặp lại tất cả các bình luận được đăng bởi Tác giả của một bài đăng cụ thể.

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

Điều này cho tôi

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

Tôi sẽ đặt hàng theo post_id như thế nào để danh sách trên được sắp xếp là 3,3,5

Câu trả lời:


247

Có thể mở rộng mối quan hệ với các hàm truy vấn:

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

[chỉnh sửa sau khi nhận xét]

<?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
    }
}

Mô hình người dùng mặc định + ví dụ Bộ điều khiển đơn giản; khi nhận được danh sách các bình luận, chỉ cần áp dụng orderBy () dựa trên Input :: get (). (hãy đảm bảo thực hiện một số kiểm tra đầu vào;))


2
Ai đó đã đề xuất điều này trên Diễn đàn Laravel, nhưng tôi muốn có thể thực hiện việc này trong Bộ điều khiển để tôi có thể chọn trường nào để sắp xếp dựa trên đầu vào của người dùng. Có thể là tôi nên làm cho điều này rõ ràng hơn trong câu hỏi.
PrestonDocks

Tôi đã thêm một ví dụ thứ hai
Rob Gordijn

1
Cảm ơn Rob, bạn đã đưa tôi đi đúng hướng. Câu trả lời thực tế là $ comments = User :: find (10) -> comments () -> orderBy ('post_id') -> get (); Nó dường như cần phương thức get () để hoạt động. Nếu bạn có thể thêm get () vào câu trả lời của mình, tôi sẽ đánh dấu nó là câu trả lời được chấp nhận.
PrestonDocks

2
Này hoạt động tốt nếu bạn đang lấy một hồ sơ duy nhất, nhưng nếu bạn đang lấy nhiều bản ghi bạn sẽ muốn một cái gì đó nhiều hơn dọc theo dòng của stackoverflow.com/a/26130907/1494454
dangel

Nếu bạn sử dụng chế độ nghiêm ngặt mysql, được mặc định trong Laravel 5.4, f.ex, bạn sẽ nhận được SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm quyền truy cập: 1140 Trộn các cột GROUP ...
Sabine

7

Tôi tin rằng bạn cũng có thể làm được:

$sortDirection = 'desc';

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

Điều đó cho phép bạn chạy logic tùy ý trên mỗi bản ghi nhận xét có liên quan. Bạn có thể có những thứ trong đó như:

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

1
Không. Tôi đã thử điều này, nó không hoạt động. Đây là trường hợp của tôi: Tôi có hai bảng ( appointmentsschedules), truy vấn rất đơn giản: nhận appointmentsthứ tự theo schedules. datetimegiảm dần. Tôi có giải pháp bằng cách thêm cột mới trong bảng appointmentsđể lưu trữ datetimetừ bảng schedules. Và bây giờ tôi chỉ cần đặt hàng theo appointments. datetimeTôi biết đó không phải là phương pháp tốt nhất, nhưng nó giải quyết được vấn đề. XD
Fendi Setiawan

Cảm ơn bạn rất nhiều nó đã hoạt động trong trường hợp của tôi, nó thật tuyệt vời.
Pooria Honarmand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.