関係の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

私は2番目の例を追加しました
Rob Gordijn 2013

1
ロブに感謝します、あなたは私を正しい軌道に乗せました。実際の答えは$ comments = User :: find(10)-> comments()-> orderBy( '​​post_id')-> get();でした。動作させるにはget()メソッドが必要なようです。get()を回答に追加できる場合は、受け入れられた回答としてマークします。
PrestonDocks 2013

2
これは、単一のレコードを取得する場合にうまく機能しますが、複数のレコードを取得する場合は、stackoverflow.com
a / 26130907/1494454

Laravel 5.4、f.exのデフォルトであるmysql strictモードを使用すると、SQLSTATE [42000]:構文エラーまたはアクセス違反:1140 GROUP列の混合...
Sabine

8

私もできると思います:

$sortDirection = 'desc';

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

これにより、関連する各コメントレコードに対して任意のロジックを実行できます。あなたはそこに次のようなものを持つことができます:

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

1
いいえ。私はこれを試しましたが、うまくいきません。ここに私の場合だ:私は2つのテーブルを持っている(appointmentsschedules)、クエリは単純です:取得appointments順をschedulesdatetime下降。テーブルappointmentsから格納するためにテーブルに新しい列を追加することで解決策がありdatetimeますschedules。そして今、私はで注文するだけですappointmentsdatetime私はそれが最善の方法ではないことを知っていますが、問題を解決します。XD
Fendi Setiawan

私の場合はそれがうまくいった本当にありがとう、それは素晴らしかった。
Pooria Honarmand
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.