Laravel orderBy 관계에


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)

위의 목록이 3,3,5로 정렬되도록 post_id로 어떻게 주문합니까?

답변:


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

기본 사용자 모델 + 간단한 컨트롤러 예; 주석 목록을 가져올 때 Input :: get ()을 기반으로 orderBy ()를 적용하십시오. (일부 입력 확인을 수행하십시오;))


2
누군가 이미 Laravel 포럼에서 이것을 제안했지만, 사용자 입력에 따라 정렬 할 필드를 선택할 수 있도록 컨트롤러에서이 작업을 수행 할 수 있기를 바랍니다. 질문에서 이것을 더 명확하게 말 했어야 할 수도 있습니다.
PrestonDocks 2013-08-09

두 번째 예를 추가했습니다
Rob Gordijn 2013-08-09

1
감사합니다 Rob, 당신은 나를 올바른 길로 인도했습니다. 실제 답은 $ comments = User :: find (10)-> comments ()-> orderBy ( 'post_id')-> get (); 작동하려면 get () 메소드가 필요한 것 같습니다. 답변에 get ()을 추가 할 수 있으면 수락 된 답변으로 표시합니다.
PrestonDocks 2013-08-09

2
단일 레코드를 검색하는 경우 잘 작동하지만 여러 레코드를 검색하는 경우 stackoverflow.com/a/26130907/1494454
dangel

Laravel 5.4에서 기본값 인 mysql strict 모드를 사용하면 f.ex SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1140 Mixing of GROUP columns ...
Sabine

8

나는 또한 당신이 할 수 있다고 믿습니다 :

$sortDirection = 'desc';

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

이를 통해 관련된 각 주석 레코드에서 임의의 논리를 실행할 수 있습니다. 거기에 다음과 같은 물건을 넣을 수 있습니다.

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

1
아니. 나는 이것을 시도했지만 작동하지 않습니다. 내 경우는 다음과 같습니다. 두 개의 테이블 ( appointmentsschedules)이 있고 쿼리는 간단합니다. get appointmentsorder by schedules. datetime내림차순. 나는 테이블에 새 열을 추가하여 솔루션이 appointments가게에 datetime테이블을 schedules. 이제 주문 만하면됩니다 appointments. datetime나는 그것이 최선의 방법이 아니라는 것을 알고 있지만 문제를 해결합니다. XD
Fendi Setiawan

제 경우에 효과가 정말 좋았습니다.
Pooria Honarmand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.