Как сделать вложенный запрос используя CActiveDataProvider?

Подскажите с такой задачкой: нужно вывести по одной последней фотографии каждого пользователя, есть две таблицы users(id,login) и photos(id,user_id,url,date). sql запрос получается такой:


SELECT * FROM (

                    SELECT *, DATE_FORMAT(date, "%d.%m.%Y" ) AS date

                    FROM `photos` `t`

                    LEFT JOIN `users` `user` ON ( `t`.`user_id` = `user`.`id` )

                    ORDER BY t.date DESC

                    ) AS p

GROUP BY p.user_id

Не пойму как этот запрос использовать в конструкции типа:


$new_photos = new CActiveDataProvider('Photos',array(

                                                             'criteria'=>array(

                                                                 'select'=>array(*,new CDbExpression('DATE_FORMAT(date,"%d.%m.%Y") as date')),

                                                                 'condition'=>'type=0',

                                                                 'order'=>'t.date DESC',

                                                                 'group'=>'user_id',

                                                                 'limit'=>5,

                                                                 'with'=>'user',

                                                                 'together'=>true,

                                                             ),

                                                             'pagination'=>false,

                                                          )

         ); 

В таком виде оно не работает, получается даты и урлы фотографий перемешиваются.

Как быть?

Можно поступить не элегантно и не через CActiveDataProvider (без возможности сортировать по дате) получая дату и урл отдельным запросом в методе модели.




//в классе модели

private $photoUrl;

private $photoDate;


public function getPhotoIMG(){

    if (!isset($this->photoUrl)) $this->queryLastPhotoData();

    return CHTml::img($this->photoUrl);

}


public function getPhotoDate(){

    if (!isset($this->photoDate)) $this->queryLastPhotoData();

    return $this->photoDate;

}


//что бы  не делать отдельный запрос на дату и на URL

private function queryLastPhotoData(){

    $sql="select photoDate, photoUrl FROM photos 

    WHERE user_id='{$this->id}' ORDER BY photoDate DESC LIMIT 1";

    $row=Yii::app()->db->createCommand($sql)->queryRow();

    $this->photoDate=$row["photoDate"];

    $this->photoUrl=$row["photoUrl"];

}

а в CGridView:


$this->widget('zii.widgets.grid.CGridView', array(

    //....

    'columns'=>array(

        //...

        array(/*'name'=>'dat',*/ 'value'=>'$data->getPhotoDate()'), //кажется без name может работать

        array('value'=>'$data->getPhotoIMG()', "type"=>"raw"), //или  "type"=>"html"

        //..

    ),

));

Сам был бы рад узнать как это сделать "правильно".

Не, кажется, не оно, мне нужно вывести именно отсортированные по дате фотки и только по одной штуке каждого юзера, а не просто в списке пользователей. Так бы можно было сделать в модели user


public function relations() {

return array(

            'last_photo' => array(self::HAS_ONE, 'Photos', 'user_id', 'order'=>'photoDate DESC'),

	);

}

В контроллере CActiveDataProvider с with=>‘last_photo’, а в виджете просто $data->last_photo->photoDate и $data->last_photo->photoUrl.

up?

не ужели никому никогда не нужны были вложенные запросы и dataprovider одновременно?

используйте DAO и CSqlDataProvider, первое надо для того, чтобы посчитать count, второе для того, чтобы вывести всё это дело красиво в gridview

и как я его не заметил!

Q-Zma, спасибо