2016-04-26 4 views
0

私はHostStatisticモデルでこのコードを持っている:いくつかのレコードのゲッターがnullを返す場合、Yii2 MongoDB ActiveRecordの関係フィールドでレコードをソートする方法は?

public function getRhost() 
{ 
    return $this->hasOne(Rhost::className(), ['host' => 'host']); 
} 

public static function getPage($sort = null, $offset = null, $limit = null) 
{ 
    if (!$sort) { 
     $sort = ['rhost.last_time' => SORT_DESC]; 
    } 
    $offset = (int)$offset; 
    $limit = (int)$limit; 
    if (!$limit) { 
     $limit = self::DEFAULT_LIMIT; 
    } 

    return self::find() 
     ->with('rhost') 
     ->orderBy($sort) 
     ->offset($offset) 
     ->limit($limit) 
     ->all(); 
} 

すべてHostStatisticレコードがRhostのレコードを持っている場合、それが正常に動作しますが、一つまたは複数のHostStatisticレコードがRhostを持っていない場合は、レコードのソートが動作しません。例外はありませんが、データはソートされませんでした。 コードをmongo aggregationで書き直して、私が望むように動作します。しかし、私はYii2 ActiveRecordでこれをどのようにすることができますか?

答えて

0

私は結論に達しました。私は自分自身に答えを与えました - モンゴ集約は私が必要とするものを達成し、私にとってはかなり安定しています。

public static function getPage($sort = null, $offset = null, $limit = null) 
{ 
    if (!$sort) { 
     $sort = ['rhost.last_time' => -1]; 
    } 
    $offset = (int)$offset; 
    $limit = (int)$limit; 
    if (!$limit) { 
     $limit = self::DEFAULT_LIMIT; 
    } 

    $aggregate = [ 
     [ 
      '$lookup' => [ 
       'from' => 'rhosts', 
       'localField' => 'host', 
       'foreignField' => 'host', 
       'as' => 'rhost', 
      ] 
     ], 
     [ 
      '$sort' => $sort, 
     ], 
     [ 
      '$limit' => (int)$limit + (int)$offset, 
     ], 
     [ 
      '$skip' => (int)$offset, 
     ], 
    ]; 
    $mongoCollection = self::getCollection()->mongoCollection; 

    return $mongoCollection->aggregate($aggregate)['result']; 
} 
関連する問題