当SPHINX
返回id的列表时,我无法看到如何使用条件来订购我的最终结果。
我有一个包含id的数组:
$a = array(1,2,3,4,5);
这个id的数组由SPHINX
搜索引擎提供。
我想使用这个数组并通过id作为PK提取所需的数据,但我必须按如下顺序排序结果:
在拥有照片的所有用户之前拥有视频和照片的用户,列表中包含照片的用户,以及那些拥有照片的用户应按照他们最近登录的时间进行排序,最新登录位于列表顶部。在所有拥有照片的用户之后,其他用户应该在那里,最近一次登录。
我尝试了这个,没有订单字段,因为我不知道如何编写代码;
$criteria = new CDbCriteria();
$criteria->addInCondition('id', $a);
$criteria->order = "FIELD(id, " . join(',', $a) . ")";
$dataProvider = new CActiveDataProvider('user', array(
'criteria' => $criteria,
'pagination' => array(
'pageSize' => $this->pageSize,
),
));
有人试过这样的事吗?或其他建议?
答案 0 :(得分:1)
假设你为视频和照片设置了关系,你可以尝试这样的事情:
$criteria = new CDbCriteria;
$criteria->order = '
IF(videos.id IS NOT NULL AND photos.id IS NOT NULL, 1, 0) DESC,
IF(photos.id IS NOT NULL, t.lastvisit, 0) DESC,
IF(videos.id IS NULL AND photos.id IS NULL, t.lastvisit, 0) DESC';
$criteria->group = 't.id';
$users = User::model()->with(array('photos', 'videos')))->findAllByPk($c, $criteria);
$dataProvider = new CArrayDataProvider($users, array(
'pagination' => array(
'pageSize' => $this->pageSize,
),
));
确保将lastvisit更改为您用于存储其上次登录时间的字段。
我也在使用Yii + Sphinx并且拥有照片和视频关系的用户模型,所以我能够测试它并且它对我有用,但我可能会以某种方式获得幸运并且我的数据自行排序。不过,我认为这会给你一个良好的开端。
[edit]另外,为了优化这一点,我建议在照片和视频模型中专门为Sphinx创建一个scope,只选择照片和视频表中的id。然后使用它你会做:
User::model()->with(array('photos:sphinx', 'videos:sphinx')))->findAllByPk($c, $criteria);