Activerecord yii使用have通过相关模型查找模型

Activerecord yii使用have通过相关模型查找模型,activerecord,yii,Activerecord,Yii,例如,我有两个相关的模型,它们有很多关系。 需要查找名称包含“test”或关系model2.name包含“test”的所有模型 我在sql上编写了这个查询,我希望通过使用标准关系机制和CDbCriteria从ActiveRecord的结果中得到它 SELECT m1.* FROM model1 m1 LEFT JOIN model_model mm ON mm.from_id = m1.id LEFT JOIN model2 m2 ON mm.to_

例如,我有两个相关的模型,它们有很多关系。 需要查找名称包含“test”或关系model2.name包含“test”的所有模型

我在sql上编写了这个查询,我希望通过使用标准关系机制和CDbCriteria从ActiveRecord的结果中得到它

SELECT m1.* FROM model1 m1 LEFT JOIN model_model mm ON mm.from_id = m1.id LEFT JOIN model2 m2 ON mm.to_id = m2.id GROUP BY m1.id HAVING ( m1.name LIKE '%test%' OR GROUP_CONCAT(m2.name) LIKE '%test%' ); 挑选 m1.* 从…起 模型1 m1 左连接模型\ U模型mm 在mm.from_id=m1.id上 左连接模型2 m2 在mm.to_id=m2.id上 按m1.id分组 拥有( m1.name类似于“%test%” 或组_CONCAT(m2.name),如“%test%” ); Simple use Activerecord.findBySql不是一个好的解决方案,因为我有许多类似于上面的模型。因此,对于更快的组合,首选任何模型a关系

当我使用CDbCriteria.with Yii生成2查询时。 当我将CDbCriteria.with与CDbCriteria.with一起使用时,我尝试从相关表中选择所有列,这是冗余的,而且将来可能会很慢,因为关系的数量可能会比本例中多得多

你知道吗


谢谢。

您应该在“M1”模型类中定义关系:

public function relations()
{
        return array(        
            'M2s' => array(self::MANY_MANY, 'M2',
                'model_model(from_id, to_id)'),

        );
}
在M2模型中创建范围:

public function nameScope($name)
{
    $this->getDbCriteria()->mergeWith(array(
        'condition'=>'name LIKE :name',
        'params'=>array(':name'=>"%{$name}%"),
    ));
    return $this;
}
如果您准备好了,您可以这样做:

M1::model()->findAll(
    array(
        'condition' => 'name LIKE %test%',
        'with' => array(
            'M2s' => array(
                'scopes' => array(
                    'nameScope' => 'test',
                )
            )
        ),
    )
);

结果是我们有了逻辑和(M1.name像'test'和M2.name像'test'),但我需要用作用域来表示idea,我忘记了这个特性。现在看来我找到了解决办法,但需要时间检查