2016-06-16 13 views
0

短い質問

LaravelのEloquentモデルを使用すると、 morphMany多相関係を持つ列のクエリをどのように並べ替えるのですか?多形表の列別ラベリング結果

長い質問

は、私は与えられたテーブル構造を持っていると言う:

// table: images 
+ -- + ------------ + -------------- + ----- + ----------- + 
| id | imageable_id | imageable_type | views | upload_date | 
+ -- + ------------ + -------------- + ----- + ----------- + 
| 1 | 1   | User   | 100 | 2016-16-06 | 
| 2 | 3   | User   | 200 | 2016-16-06 | 
+ -- + ------------ + -------------- + ----- + ----------- + 

// table: users 
+ -- + ---- + 
| id | name | 
+ -- + ---- + 
| 1 | Bob | 
| 2 | Kat | 
+ -- + ---- + 

...と私はmorphMany多型の関係で雄弁Userモデルを持っています。

今日、アップロードした画像の視聴回数でユーザーを注文するにはどうすればよいですか?

私はこの問題を自分で試してみて、解決策を見つけることができませんでした。

User::with([ 
    'images' => function ($query) { 
     $query->where('upload_date', Carbon::today()->toDateString()) 
      ->orderBy('views', 'DESC'); 
    } 
])->get(); 

しかし、これを試した後、ユーザーが今間違って自分のインクリメントIDによって順序付けされているように私には明らかではなかった:私はこれに似たクエリを使用したとき、私は、正しい順序に来ていた最も近いでしたimagesテーブルのviews列。

私はこのことを理解するための旅で私を助けてくれてくれてありがとう。

答えて

1

http://laravel.io/forum/02-21-2014-order-and-paginate-a-collection-by-a-releted-field-using-eloquentのコメントをいただきありがとうございました。

User::leftJoin('images', function ($join) { 
    $join->on('users.id', '=', 'images.imageable_id') 
     ->where('imageable_type', '=', 'User') 
     ->where('upload_date', '=', Carbon::today()->toDateString()); 
}) 
    ->orderBy('images.views') 
    ->select(['players.*']); 

私は前にこれに似た何かをしようとしたが、ID、およびその他の列は、2つの結合テーブルの間で衝突されたので、問題が発生しました。今回の相違点は->select(['users.*'])です。これで、ユーザーのデータのみが返されます。

2

また、コレクションのsortByメソッドを使用することもできます。

$users = User::with([ 
    'images' => function ($query) { 
     $query->where('upload_date', Carbon::today()->toDateString()); 
    } 
])->get()->sortByDesc(function ($user) { 
    return $user->images->views; 
}); 
関連する問題