Search code examples
mysqlcakephphas-and-belongs-to-manytable-relationships

CakePHP: finding information in distantly related models


I have a News model, which has a HABTM relationship with an Artists model, and an artist in turn hasMany tourdates.

If I want to find all tourdates related to the current news item, what is an efficient way of phrasing that for CakePHP?

This is what I have so far; I'm wondering if (a) it looks like it should work, and (b) if there's any more concise way of writing it:

    $relatedartists = $this->News->ArtistsNews->find('list', array(
        'conditions'=>array('ArtistsNews.news_id' => $id),
        'fields'=>array('artist_id')
    ));
    $livedates = $this->News->Artists->Tour->find('all', array(
        'conditions'=>array('Tour.artist_id'=> $relatedartists, 
            'date >= ' . time()),
        'order'=>'date ASC'
    ));

Solution

  • What you have is pretty good. I always prefer to use multiple queries rather than use massive joins which create temporary tables. It can reduce performance somewhat.

    You might also try something like the below

    $opts = array(
      'conditions' => array(
         'ArtistsNews.news_id' => $id
       )
    );
    $this->News->Artists->recursive = 2;
    $this->News->Artists->find('all', $opts);
    

    Something along the likes of this query will also get you what you need (haven't error checked)