使用Yii Criteria时如何订购从SPHINX收到的数据?

时间:2013-01-23 09:45:00

标签: php sql yii sphinx criteria

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,
                    ),
                ));

有人试过这样的事吗?或其他建议?

1 个答案:

答案 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);