使用关系查找模型的兄弟姐妹

时间:2012-06-06 21:36:46

标签: php yii

这是模型的表格:

CREATE TABLE IF NOT EXISTS `SomeModel` (  
  `id` int NOT NULL AUTO_INCREMENT,  
  `parent_id` int NOT NULL
)  

我的目标是能够使用以下内容查询模型及其兄弟:

SomeModel::model()->with('siblings')->findByPk($id);

以下是我目前对这种关系的尝试:

public function relations()
{
    return array(
        'siblings' => array(self::HAS_MANY, 'SomeModel', array('parent_id'=>'parent_id')),
    );
}

问题在于我无法找到创建条件的方法,因此模型本身不会与$model->siblings数组中的兄弟一起返回。

任何想法都会很棒。

谢谢!

1 个答案:

答案 0 :(得分:3)

更改您与此的关系:

'siblings'=>array(self::HAS_MANY, 'Address', array('parent_id'=>'parent_id'),'condition'=>'siblings.id!=t.id')

编辑:在documentation for relation()中有一些解释,我们可以为发生的加入和其他选项指定额外的选项:

  

可以在其余数组元素中将其他选项指定为名称 - 值对。

此外,该表的默认别名为t,因此使用t.id

编辑:来自评论:

实现延迟加载,你想要它的方式,将很难完成(我不知道如何,不确定是否可能),但我可以建议通过

更好地使当前代码
  1. 使用named scopes,在进行预先加载时使用范围,并在范围中添加条件siblings.id!=t.id

    // add this function to your model, and remove the condition from the relation
    public function scopes(){
     return array(
        'eagerSibs'=>array(
            'condition'=>'siblings.id!=t.id',
        ),
     );
    }
    

    急切加载范围:

    SomeModel::model()->eagerSibs()->with('siblings')->findByPk($id);
    

    这将使用延迟加载$model->siblings

  2. 删除错误
  3. 虽然延迟加载的错误将被删除,但您仍然会获得当前记录,以反击您可以添加和使用模型的功能,该功能将加载相关记录而不使用当前记录,但是当然您将不会使用$model->siblings,而是使用以下内容:$model->getLazySibs();

    public function getLazySibs(){
        $sibs=$this->siblings;
        foreach ($sibs as $asib){
            if ($asib->id != $this->id)
                $lazySibs[]=$asib;
        }
        return $lazySibs;
    }