2017-07-14 16 views
0

どのように私はこれらのようなクエリをeloquent/query builderで書くのですか。 助けていただければ幸いです。あなたがこれを行うことができますLaravel Eloquent/QueryBuilder複数のネストされた選択

Select 
      s.user_id, 
      s.user_name, 
      s.`user_firstname`, 
      s.`user_lastname`, 
      s.user_photo, 
      max_rank_timestamp, 
      max_friend_timestamp 
    FROM 
      (
      SELECT 
       Users.user_id, 
       Users.`user_name`, 
       Users.`user_firstname`, 
       Users.`user_lastname`, 
       `Users`.`user_photo`, 
       MAX(Ranks.rank_timestamp) AS max_rank_timestamp 
      FROM 
       `Users` 
       LEFT JOIN Ranks ON Ranks.user_id = Users.user_id 
      WHERE 
       Users.user_is_active = 1 
      GROUP BY 
       Users.user_id 
     ) s 
      LEFT JOIN (
         SELECT 
         Users.user_id, 
         MAX(Relationship.timestamp) AS max_friend_timestamp 
         FROM 
         `Users` 
         INNER JOIN Relationship ON Relationship.user_one_id = Users.user_id 
         WHERE 
         Users.user_is_active = 1 
         GROUP BY 
         Users.user_id 
        ) p ON s.user_id = p.user_id 
    ) t 
    ORDER BY 
     `user_name` ASC 

ユーザーモデル

public function ranks(){ 
    return $this->hasMany('App\Rank','user_id','user_id'); 
} 

public function relationships(){ 
    return $this->hasMany('App\Relationship','user_one_id','user_id'); 
} 

ランクモデル

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

関係モデル

public function user(){ 
    return $this->belongsTo('App\User','user_id','user_one_id'); 
} 
+0

あなたのユーザモデルに「Relationship」と「Ranks」の関係が設定されていますか? –

+0

はい、私はユーザーモデル上の関係です。 –

+0

ユーザーからの階級と関係の両方に1対多の関係があります。 @RossWilson –

答えて

0

一つの方法は、あなたのUserに次のスコープを追加することですモデル:

public function scopeWithMaxRankTimestamp(Builder $query) 
{ 
    if (is_null($query->getQuery()->columns)) { 
     $query->select([$query->getQuery()->from . '.*']); 
    } 

    $relation = Relation::noConstraints(function() { 
     return $this->ranks(); 
    }); 

    $q = $this->ranks()->getRelationExistenceQuery(
     $relation->getRelated()->newQuery(), $query, new Expression('MAX(rank_timestamp)') 
    ); 

    $query->selectSub($q->toBase(), 'max_rank_timestamp'); 
} 

public function scopeWithMaxFriendTimestamp(Builder $query) 
{ 
    if (is_null($query->getQuery()->columns)) { 
     $query->select([$query->getQuery()->from . '.*']); 
    } 

    $relation = Relation::noConstraints(function() { 
     return $this->relationships(); 
    }); 

    $q = $this->relationships()->getRelationExistenceQuery(
     $relation->getRelated()->newQuery(), $query, new Expression('MAX(timestamp)') 
    ); 

    $query->selectSub($q->toBase(), 'max_friend_timestamp'); 
} 
は上記 Ranksテーブルの関係が ranks()であり Relationshipテーブルの関係が relationships()あると仮定する。

あなたは、クラスの先頭に次の useステートメントを追加する必要があります動作するように上記の場合

use Illuminate\Database\Eloquent\Relations\Relation; 
use Illuminate\Database\Query\Expression; 

次にあなたがそうのようなあなたの結果を使用することができます。

$users = User::withMaxRankTimestamp() 
    ->withMaxFriendTimestamp() 
    ->where('user_is_active', 1) 
    ->orderBy('user_name') 
    ->get(); 

・ホープこれは役に立ちます!

関連する問題