注文

2016-09-28 8 views
1

私はテーブルがusersと呼ばれている場合:注文

| id | username | password | 

を、テーブルがuser_stats呼ば:

| id | user_id | num_posts | 

私はすべてのユーザーを取得し、ポストの数によってそれらを並べ替えることができますどのように彼ら持ってる?

マイUser.phpモデルはこの関係を持っています

public function stats() 
{ 
    return $this->hasOne('App\UserStat'); 
} 

そして、私のUserStat.phpモデルは、この関係を持っています

public function user() 
{ 
    return $this->belongsTo('App\User'); 
} 

私は同じように、クエリビルダを使用して参加行うことができます知っている:

$users = User::join('user_stats', 'users.id', '=', user_stats.user_id') 
    ->orderBy('user_stats.num_posts', 'DESC') 
    ->get(); 

しかし、Eloquを使用するより良い方法がありますORM?

答えて

0

私はあなたがちょうどEloquentでこれを処理することはできませんが、それは非常に近いあなたを得ることができるとは思わない... Collectionの方法を使用して残りの方法を得ることができます。

$users = App\User::with('stats')->get(); 
$sortedUsers = $users->sortByDesc(function($user) { 
    return $user->stats->count(); 
}); 
0

うまくいけば、これはあなたの問題

0

短編小説解決します

public function stats() 
{ 
    return $this->hasOne('App\UserStat')->orderBy('num_posts', 'desc'); 
} 

$users = App\User::with('stats')->get(); 

である場合があります。利用可能$user->postCountのようなものを作るためにカスタムaccessorを定義

  1. を。
  2. sortByDescコールバック関数でこのアクセサーを使用します。

ロング説明:

  1. あなたUserモデルにおけるこのカスタムアクセサを定義します。その後

    public function getPostCountAttribute() { 
        $stats = $this->stats; // from the 'stats()' you have defined 
        return $stats->num_posts; 
    } 
    
  2. 、あなたのコレクションを並べ替えるためにsortByDescを使用しています。 postCountを使用すると、Userモデルにstats()の関係が盛り込まれることを忘れないでください。そうでないと、Laravelはコレクション内の各Userオブジェクトに対して1つのクエリを作成します。

    // Eager Loading stats() relationship 
    $users = User::with('stats')->get(); 
    
    // Sort by descending using the postCount attribute of User 
    $sorted = $users->sortByDesc(function ($user) { 
        return $user->postCount; 
    });