2012-07-21 47 views
1

我对through关系verymuch困惑。这里是我的表如何使用活动记录指定此关系?

批次(ID,姓名)

主题(ID,BATCH_ID,名)

老师(ID,姓名)

subject_teacher(subject_id,teacher_id)

关系是

批次HAS_MANY科目

个科目通过subject_teacher belongs_to的一批

主题MANY_MANY教师

教师MANY_MANY科目通过subject_teacher

不,我怎么可以指定让一批

  1. 教师分配
  2. 批次的关系一位老师

我试着用through选项,但它似乎没有与MANY_MANY关系的工作。除了遍历每个主题之外,还有其他更好的方法吗?

编辑: 我知道我可以通过函数在教师模型

public function getBatches() 
{ 
    $batches=array(); 
    foreach($this->subjects as $subject) 
     $batches[]=$subject->batch; 
    return $batches; 
} 

得到老师的科目,现在我可以通过参考$teacher->batches得到老师的批次。但我需要一个更清洁的关系,如解决方案,以便在代码中的某些地方我可以发出如下声明:Teacher::model()->with('batches')->findAll()

回答

0

我认为这是通过主题循环的唯一方法。除非你不通过活动记录来完成。

//pseudo code.... 
    Teacher=new Teacher::model()->with('subject.batch')->find(); 
    subjects=Teacher->subjects; 
    for(subjects as subject){ 
     batch=subejct->batch; 
    } 

直通关系只能应用于一对多或一对一的情况,而不是多对多。

+0

这种解决方案的问题是,我们不能使用任何与(“批次”)的预先加载,我认为这将导致执行许多查询 – dInGd0nG 2012-07-21 17:13:17

+0

是的,你可以看到更新的代码。 – bingjie2680 2012-07-21 17:21:02

+0

它不起作用。由于教师模型中没有“主题”。这是'科目'。因此,我们不能在使用“subject.batch”() – dInGd0nG 2012-07-21 17:59:46