2013-01-23 1 views
1

SPHINX은 ID의 목록을 반환하므로 기준을 사용하여 최종 결과를 주문하는 방법을 알 수 없습니다.Yii Criteria를 사용할 때 SPHINX로부터받은 데이터를 주문하는 방법은 무엇입니까?

나는 아이디의 포함 된 배열을 가지고 :

아이디의이 배열이 결과로 SPHINX 검색 엔진에 의해 주어졌다
$a = array(1,2,3,4,5); 

.

내가이 배열을 사용하고 PK와 같은 ID로 필요한 데이터를 추출 할,하지만 난이이 같은 결과를 주문해야 : 사진 옆에 바로 사진과 함께 모든 사용자 전에 비디오와 사진

사용자를 사용자 목록에서 사진이있는 사용자는 가장 최근에 로그인 한 시간순으로 가장 최근 로그인을 목록 상단에 정렬해야합니다. 사진이있는 모든 사용자는 나머지 사용자가 있어야하며 가장 최근에 가장 먼저 로그인해야합니다.

코드를 작성하는 방법을 알지 못해서 순서 필드없이이 작업을 시도했습니다.

$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

당신은 비디오와 사진에 대해 설정된 관계를 가정하면, 다음과 같이 뭔가를 시도 할 수 :

$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를 사용하고 있으며 사진과 비디오 관계가있는 사용자 모델을 가지고 있기 때문에 이것을 시험 할 수 있었고 저에게 효과적이었습니다. 그러나 어떻게 든 행운이 났고 데이터 자체가 주문되었을 수도 있습니다. 아직도, 나는 이것이 당신에게 좋은 출발을 줄 것이라고 생각한다.

[편집] 또한이 비트를 최적화하려면 사진 및 비디오 테이블에서 ID 만 선택하는 스핑크스 전용 사진 및 비디오 모델에 scope을 만드는 것이 좋습니다. 그런 다음 사용하면됩니다.

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