【问题标题】:How to order data received from SPHINX when using Yii Criteria?使用 Yii Criteria 时如何订购从 SPHINX 接收的数据?
【发布时间】:2013-01-06 17:56:47
【问题描述】:

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

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

【问题讨论】:

    标签: php sql yii sphinx criteria


    【解决方案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 并且拥有包含照片和视频关系的用户模型,因此我能够对此进行测试并且它对我有用,但可能我很幸运并且我的数据自行排序。不过,我认为这会给你一个好的开始。

    [编辑] 另外,为了优化这一点,我建议在照片和视频模型中创建一个scope,专门用于 Sphinx,它只从照片和视频表中选择 id。然后使用它你会这样做:

    User::model()->with(array('photos:sphinx', 'videos:sphinx')))->findAllByPk($c, $criteria);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多