2017-07-14 92 views
0

我會如何在eloquent/query builder中編寫像這樣的查詢語句?查詢哪裏有多個嵌套的帶連接的嵌套select語句。 任何幫助將不勝感激。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

用戶的等級和關係有一對多的關係。 @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(); 

希望這有助於!