php - 使用关系查找模型的 sibling

标签 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 数组中的同级模型一起返回。

任何想法都会很棒。

谢谢!

最佳答案

改变你与此的关系:

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

编辑:一些解释,在documentation for relation()中,我们可以为发生的连接指定额外的选项以及这些附加选项:

Additional options may be specified as name-value pairs in the rest array elements.

加上表的默认别名是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. 虽然延迟加载的错误将被删除,但您仍然会获取当前记录,为了应对这一点,您可以添加并使用模型的函数,该函数将加载相关记录而无需当前记录,但是当然您不会使用 $model->siblings,而是使用类似: $model->getLazySibs();

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

关于php - 使用关系查找模型的 sibling ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922666/

相关文章:

php - 如果右连接不返回任何行,则 mysql 设置为 null 或 0

mysql - 选择在 Yii CDbCriteria 中不起作用

php - 渲染 javascript 文件,同时将其作为静态文件使用

php - 如何在dompdf中创建多个页面

php - 将 google reCaptcha 集成到现有的付款表单中

php - Xdebug 跟踪 GUI?

php - Zend Framework 2 中使用 PHPUnit 模拟服务

php - 从 php 连接到 mysql 失败且无提示

yii - CGridview 与 Yii Active Record 关系

php - 不支持 Yii FULLTEXT,但绝对支持