thyseus
(Thyseus)
February 21, 2010, 8:49pm
1
Hi,
is it possible to lazy load a MANY_MANY Relation with CActiveRecord yet?
For example, let’s assume we have Post and Categories with a Many_many Relation:
$post = Post::model()->findByPk(11);
print_r($post->categories);
should print an array of Category Objects that’s been attached to the Post Nr. 11.
i don’t think it is possible yet, and that’s why i wanted to include this magic in my CAdvancedArBehavior, but i ran into some problems.
Overriding the __get() magic function of PHP in an Behavior doesn’t seem to work - the function
simply doesn’t get run when calling it with the behavior attached:
public function __get($value) {
return parent::__get($value) . 'test';
}
so, my simple question: is there a way to lazy load Many_Many Relations with ActiveRecord and if not:
how is it possible to override the default behavior of CActiveRecord without using __get() ?
thyseus
(Thyseus)
February 21, 2010, 9:50pm
2
This is my workaround:
public function getRelatedManyManyObjects() {
$sql = sprintf("select * from %s where %s = %s",
$this->manyManyTable,
$this->manyManyTableLeft,
$this->_Model->{$this->_Model->tableSchema->primaryKey});
$result = Yii::app()->db->createCommand($sql)->queryAll();
foreach($result as $foreignObject) {
$objects[] = $foreignObject[$this->manyManyTableRight];
}
return $objects;
}
assuming that:
preg_match_all('/^.*\(/', $value[2], $matches);
$this->manyManyTable = substr($matches[0][0], 0, strlen($matches[0][0]) -1);
preg_match_all('/\(.*,/', $value[2], $matches);
$this->manyManyTableLeft = substr($matches[0][0], 1, strlen($matches[0][0]) - 2);
preg_match_all('/,.*\)/', $value[2], $matches);
$this->manyManyTableRight = substr($matches[0][0], 2, strlen($matches[0][0]) - 3);
this works, but it would be much cooler implemented in the ActiveRecord.
btw: my need to have this feature is the implementation in my Relation Widget, which now support MANY_MANY Relations…
mikl
(Mike)
February 21, 2010, 10:19pm
3
Any related records will be lazy loaded when accessing the relation property the first time. Are you sure your relations are set up correctly? Maybe try to test with a simplified model.