Named scope - Get orphan AR without loosing primary key

You are viewing revision #1 of this wiki article.
This version may not be up to date with the latest version.
You may want to view the differences to the latest version.

next (#2) »

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;  
}
0 0
2 followers
Viewed: 9 379 times
Version: Unknown (update)
Category: Tutorials
Tags:
Written by: cma
Last updated by: Steve Friedl
Created on: Jul 28, 2010
Last updated: 13 years ago
Update Article

Revisions

View all history