2

这是模型的表:

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数组中的兄弟姐妹一起返回。

任何想法都会很棒。

谢谢!

4

1 回答 1

3

改变你的关系:

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

编辑:一些解释,在文档中relation(),我们可以为发生的连接指定额外的选项和这些额外的选项:

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

再加上表的默认别名是tuse t.id

编辑:来自评论:

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

  1. 使用命名范围,在进行预加载时使用范围,并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. 虽然延迟加载的错误将被删除,但您仍将获得当前记录,以反驳您可以添加和使用模型的功能,该功能将在没有当前记录的情况下加载相关记录,但您当然不会使用$model->siblings,而是有类似的东西:$model->getLazySibs();

    public function getLazySibs(){
        $sibs=$this->siblings;
        foreach ($sibs as $asib){
            if ($asib->id != $this->id)
                $lazySibs[]=$asib;
        }
        return $lazySibs;
    }
    
于 2012-06-07T04:45:28.737 回答