如果某些记录中的getter返回null,如何按Yii2 MongoDB ActiveRecord中的关系字段对记录进行排序?

时间:2016-04-26 17:40:15

标签: php mongodb sorting activerecord yii2

我在HostStatistic模型中有这个代码:

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聚合重写代码,它可以按我的意愿工作。但是我怎样才能对Yii2 ActiveRecord做同样的事情?

1 个答案:

答案 0 :(得分:0)

我得出结论,在我给自己答案的问题中 - mongo聚合完成了我需要的东西,并且对我来说非常稳定。

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'];
}