这是模型的表格:
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
。
编辑:来自评论:
按照您想要的方式实现延迟加载将很难完成(我不知道如何实现,也不确定是否可能),但是我可以建议通过
使当前代码变得更好使用 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
虽然延迟加载的错误将被删除,但您仍然会获取当前记录,为了应对这一点,您可以添加并使用模型的函数,该函数将加载相关记录而无需当前记录,但是当然您不会使用
$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/