12

私はlaravel(CIから切り替え)に不慣れで、雄弁なORMはまだある時点で少し謎です!

これが私の問題です:

Eloquentを使用してデータベースからデータを並べ替えたいのですが。

私はテーブルの投稿とテーブルのコメントを持っています(投稿には多くのコメントがあり、コメントは投稿に属しています)

すべてのコメントにはタイムスタンプ(=> created_atフィールド)があり、次のように注文したいと思います。

(私たちはプロファイルページにいるので、$ user-> idはユーザーのIDです(明らかに))

このユーザーがコメントを作成した投稿からのすべての投稿が必要であり、コメントのcreated_atフィールドですべての投稿を並べ替えます

私は本当にEloquentを完全に、または少なくともFluentを使いたいのですが、その正しい方法がわかりません。

はっきりしているといいのですが、お時間をいただきありがとうございます!

4

5 に答える 5

19

私が開発しているプロジェクトで同じ問題に遭遇しました。どこを見ても、usort()またはuasort()をこの問題を解決するための提案された方法として見ました。(Collection::sort() は単なるラッパーですuasort())しかし、SQLがORDER BY句を使用してソートする必要があるのに、なぜPHPを使用してソートするので、それは私を満足させませんでしたか?getXXXAttribute()メソッドを使用してこのように実装することになりました。

class Post extends Eloquent {
    public function comments()
    {
        return $this->hasMany('Comment');
    }

    public function getCommentsAttribute()
    {
        $comments = $this->comments()->getQuery()->orderBy('created_at', 'desc')->get();
        return $comments;
    }
    ...
}
于 2013-10-10T00:10:36.950 に答える
3

以前も同じ問題がありましたが、それは1対1の関係でした。この投稿は私を助けました。結合を使用することになりました。私のコードは次のようなものでした:

$data = Posts::join('comments', 'comments.post_id', '=', 'posts.id')
        ->order_by('comments.created_at')
        ->get(array('comments.field1 as field1', 'posts.field2 as field2'));
于 2013-07-30T08:55:38.553 に答える
2

このようなものが役立つ可能性があります。

$content = Posts::with(array('comments' => function($query) {
               $query->order_by('created_at', 'asc');
            }))
            ->get();

または、問題がより複雑な場合:

EloquentORMの多対多関係のピボットテーブルのフィールドで並べ替える方法

于 2013-03-21T08:37:01.237 に答える
1

ユーザークラスで関係が定義されている場合は、コメントを介してすべての投稿を取得できます。これは、sortBy()およびsortByDesc()関数を提供するコレクションを返します。これらの関数は両方とも、自分でソートメソッドを選択できるコールバックを受け入れます。

$posts = $user->comments->post->sortByDesc(function($post) {
    return $post->created_at;
});
于 2015-11-11T17:11:13.923 に答える
0

あなたが直面している問題は、あなたが定義したリレーションシップが投稿に関連付けられたコメントを提供しているだけであり、その結果の「Order By」はコメントが出てくるものであるため、コメントを並べ替えるだけだからです。したがって、コメントモデルで「コメント」が「投稿」に属することを定義し、コメントが関連付けられている投稿を見つけて、usort()関数を使用して手動比較を実行することもできます。例は次のとおりです(私はLaravel3でコードを書いていますが、他のバージョン用に書き直すことができます):

したがって、CommentsテーブルにPostsテーブルとの関係を定義するpostIDという外部キーがあり、Postsテーブルのタイムスタンプがデフォルトのcreated_atであり、Usersテーブルが外部キーuseridでCommentsテーブルに接続されていると仮定します。

    $userid = $user->id;
    $comments = Comments::where_userid($userid);
    function commentsort($first, $second){
      if (getCommentPost($first) == getCommentPost($second)) {
        return 0;
      }
     return (getCommentPost($first) < getCommentPost($second)) ? -1 : 1;
    }

    function getCommentPost($comment){
    return Post::where_postid($comment->postid)->first()->created_at;
    }

    usort($comments, "commentsort");

これは修正に役立つはずです。実際には、これはフレームワークであるためLaravelには含まれていません。特定の機能を実行するこのような機能は、使用範囲が限られているため、通常はフレームワークに含まれていません。この機能をプロジェクトで普遍的に使用するために、デフォルトのDBクラスでこの関数を使用します。

于 2013-03-25T18:35:16.793 に答える