Hello all,
I have the following problem: in a model, called "Playlist", I want to display, order and search data from a different model, called "Canzoni".
There’s a MANY_MANY relationship between the two models. Inside the “Canzoni” search function, I additionally search inside two other relations: “Album” and “Artista”.
In the “Playlist” views, the data is correctly displayed and ordered, but the search doesn’t work at all. The mysql logs show that the query is built as the search fields are all blank, without the “WHERE LIKE” clause.
In the "Canzoni" views, the search is working correctly even for the related data.
My code is the following.
Playlist model, relations:
public function relations()
{
return array(
'canzonis' => array(self::MANY_MANY, 'Canzoni', 'canzoni_playlist(playlist_id, canzone_id)'),
);
}
Canzoni model, relations:
public function relations()
{
return array(
'album' => array(self::BELONGS_TO, 'Album', 'album_id'),
'artista' => array(self::BELONGS_TO, 'Artisti', 'artista_id'),
'playlists' => array(self::MANY_MANY, 'Playlist', 'canzoni_playlist(canzone_id, playlist_id)'),
);
}
Canzoni model, search:
public function search()
{
$criteria=new CDbCriteria;
$criteria->with=array(
'album',
'artista',
);
$criteria->together = TRUE;
$criteria->compare('LOWER(titolo)',strtolower($this->titolo));
$criteria->compare('LOWER(artista.nome)',strtolower($this->artista_id),TRUE);
$criteria->compare('LOWER(album.titoloalbum)',strtolower($this->album_id),TRUE);
$criteria->compare('create_time',$this->create_time,TRUE);
$criteria->compare('durata',$this->durata);
$criteria->compare('tot_esecuzioni',$this->tot_esecuzioni);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort' => array (
'defaultOrder'=>'artista.nome ASC',
'attributes' => array (
'titolo',
'artista_id' => array (
'asc'=>'artista.nome',
'desc'=>'artista.nome DESC',
),
'album_id' => array (
'asc'=>'album.titoloalbum',
'desc'=>'album.titoloalbum DESC',
),
'create_time',
'tot_esecuzioni',
),
),
));
}
In the Playlist views, I use the search function from the Canzoni model, this way:
$pageSize=Yii::app()->user->getState('pageSize',Yii::app()->params['defaultPageSize']);
$this->widget('zii.widgets.grid.CGridView', array (
'id'=>'canzoni-playlist',
'selectableRows'=>2,
'showTableOnEmpty'=>false,
'emptyText'=>'Nessun brano in questa playlist',
'dataProvider'=>Canzoni::model()->with(array(
'playlists'=>array(
'condition'=>'playlists.id = :playlistID',
'params'=>array(':playlistID' => $model->id),
),
)
)->search(),
'filter'=>Canzoni::model()->with(array(
'playlists'=>array(
'condition'=>'playlists.id = :playlistID',
'params'=>array(':playlistID' => $model->id),
),
)
),
'columns' => array (
'titolo'=>array(
'name'=>'titolo',
'type'=>'raw',
'value'=>'CHtml::link(CHtml::encode($data->titolo), array("/canzoni/view", "id"=>$data->id))',
'filter' => CHtml::activeTextField(Canzoni::model(), 'titolo'),
'header'=>'Titolo',
),
array(
'name'=>'artista_id',
'header'=>'Artista',
'value'=>'$data->artista->nome',
'filter'=>CHtml::listData(Artisti::model()->findAll(array('order'=>'nome ASC')), 'nome','nome'),
),
array(
'name'=>'album_id',
'header'=>'Album',
'value'=>'$data->album->titoloalbum',
'filter'=>CHtml::listData(Album::model()->findAll(array('order'=>'titoloalbum ASC')), 'titoloalbum','titoloalbum'),
),
)
));
The dropdown menus have the right data inside them, only search isn’t working.
I also tried a different search function, adding the additional criteria inside it:
$criteria->condition = "playlists.id = :playlistID";
$criteria->params = array(':playlistID' => $playlistId);
....
all the other code is identical to the search posted above
...
Hints, anyone?
Let me know if some other information is needed.
Thanks in advance,
Andrea