这是模型的表格:
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
数组中的兄弟一起返回。
任何想法都会很棒。
谢谢!
答案 0 :(得分:3)
更改您与此的关系:
'siblings'=>array(self::HAS_MANY, 'Address', array('parent_id'=>'parent_id'),'condition'=>'siblings.id!=t.id')
编辑:在documentation for relation()
中有一些解释,我们可以为发生的加入和其他选项指定额外的选项:
可以在其余数组元素中将其他选项指定为名称 - 值对。
此外,该表的默认别名为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;
}