我在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做同样的事情?
答案 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'];
}