Yii 1.1: Named scope - Get orphan AR without losing primary key

2 followers

Sometime, in a many-to-many relation, you need to retrieve AR that aren't linked. In practice, AR with null value in the join table. So you implements a criteria like this :

public function scopeUnused( $useAnd = true )
    {
        $join = " left outer join composed_by j on t.ID = j.ID ";
        $condition = ' j.ID Is Null';
 
        $criteria = new CDbCriteria();
        $criteria->join = $join;
        $criteria->condition = $condition;
 
        self::getDbCriteria()->mergeWith( $criteria , $useAnd );
 
        return $this;  
    }

You face the problem that your AR's pk are empty ?!! It come from the fact that the generated sql query returns by default all columns (select *). To overcome this, you need to explicitly specify the columns of your AR in the select property of the DBCriteria

public function scopeUnused( $useAnd = true )
    {
        $join = " left outer join composed_by j on t.ID = j.ID ";
        $condition = ' j.ID Is Null';
        $select = ' t.ID, t.FIELD1, t.FIELDX';
 
        $criteria = new CDbCriteria();
        $criteria->join = $join;
        $criteria->select = $select;
        $criteria->condition = $condition;
 
        self::getDbCriteria()->mergeWith( $criteria , $useAnd );
 
        return $this;  
    }

Be the first person to leave a comment

Please to leave your comment.

Write new article
  • Written by: cma
  • Updated by: Steve Friedl
  • Category: Tutorials
  • Yii Version: 1.1
  • Votes: No votes yet
  • Viewed: 5,023 times
  • Created on: Jul 28, 2010
  • Last updated: Apr 9, 2011