1.安装jenssegers/mongodb
composer require jenssegers/mongodb
2.定义model
class XXMODEL extends Jenssegers\Mongodb\Eloquent\Model implements Transformable
{
use TransformableTrait;
protected $connection = 'CONNECTTION_NAME';
protected $collection = 'COLLECTION_NAME';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [];
}
3.列表+筛选+分类
public function list($where){
if (!empty($where['limit'])) {
$limit = $where['limit'];
unset($where['limit']);
} else {
$limit = config('repository.pagination.limit');
}
$data = XXMODEL::raw(function ($collection) use($limit,$where) {
//条件
$aggregate = array();
//查询数组
$selectArr = array();
if(!empty($where['select']['keyword'])){
$selectArr['keyword'] = ['$regex' => ''. $where['select']['keyword'] . '', '$options' => "i"];
}
if(!empty($where['select']['city'])){
$selectArr['value.city'] = $where['select']['city'];
}
//聚合数组
$groupArr = $groups = array();
if(!empty($where['groups']['keyword'])){
$groupArr['keyword'] = '$keyword';
}
if(!empty($where['groups']['city'])){
$groupArr['city'] = '$value.city';
}
if(!empty($groupArr)){
$groups['_id'] = $groupArr;
$groups['sum_clicks'] = ['$sum' => '$click_nums'];
}
$aggregate[]['$match'] = $selectArr;
if(!empty($groups)){
$aggregate[]['$group'] = $groups;
}
$count = sizeof($collection->aggregate($aggregate)->toArray());
//先排序在分页
if(!empty($where['groups']['date'])){
$sort = ['_id.date' => -1];
}else{
$sort = ['date' => -1];
}
$aggregate[]['$sort'] = empty($where['sort']) ? $sort : [$where['sort']['name'] => $where['sort']['order']];
$aggregate[]['$skip'] = ((empty($where['page']) ? 1 : $where['page'])-1) * $limit;
$aggregate[]['$limit'] = $limit;
//生成paginate分页的格式方便前端
return new LengthAwarePaginator($collection->aggregate($aggregate)->toArray(), $count, $limit,!empty($where['page'])?$where['page']:1, [
'path' => Paginator::resolveCurrentPath(),
'pageName' => 'page',
]);
});
return $data;
}