我正在为巴西的一所大学开发一个系统。在这个系统中,我有以下模型: - 国家; - 国家; - 城市; - 大学; - 单位; - 班级;
确定。关系是: - 国家属于国家; - 城市属于国家; - 大学属于国家(因为,在我的数据库中,并非每个国家都有注册的国家,并非每个州都有城市注册,所以我不能要求用户将大学注册到城市); - 单位属于大学; - 班级属于大学(因为并非每所大学都有注册单位);
确定。我想现在我已经为你们了解我的情况设置了一个很好的背景。现在问题本身:
在我的模型类视图中,我想显示国家和(如果有州城)。我可能需要在其他模型视图中显示此类内容,例如Unit和University。
但是当我尝试在我的Class模型中执行此操作时,我只能显示country_id。我大学数据库表中的外键。那是为什么呢,那是因为我的班级模型属于大学,因此访问我大学的房产非常容易。但是我不想访问国家的ID,我想要它的名字。也许在将来我可能想要其他属性,谁知道?
我该怎么做?当我的模型类与它没有直接关系时,如何访问模型国家/地区的属性?
许多拥抱和亲吻。希望有人可以帮我这个。P.S: 我已经管理了一个有点失败者的解决方案:在我的类控制器中,我已经完成了以下操作(因此我可以访问模型国家,州和城市的变量):
然后我使用find方法查找我想要在view.ctp中显示的相关课程的相应国家,州和城市。代码如下:
public function view($id = null) {
$this->Class->id = $id;
$this->set('class', $this->Class->read());
$this->loadModel('State');
$this->loadModel('City');
$country = $this->Class->Universsity->Country->find('first', array('conditions' => array('Country.id' => $this->Class->data['University']['country_id']),));
$state = $this->State->find('first', array('conditions' => array('State.id' => $this->Class->data['University']['state_id']),));
$city = $this->City->find('first', array('conditions' => array('City.id' => $this->Class->data['University']['city_id']),));
$this->set('country',$country['Country']);$this->set('city',$city);
$this->set('state',$state);
}
它有点工作......在我的Wiew.ctp中,我得到一个国家数据数组,状态数据数组和城市数据数组。在视图中,我检查状态和城市数组是否不是length = 0来显示它们以及所有...但我认为有更好的方法来做到这一点。
P.P.S:
另一个问题是...... Index.ctp怎么样?如果我不知道我和哪个班级合作,我该怎么办呢?我是否必须在视图中使用逻辑并查找方法?这不仅仅是弄乱了代码吗?
答案 0 :(得分:1)
如果不发布代码,很难指出正确的方向。但是,假设您正确配置了模型,您应该能够执行以下操作:
public class ClassController extends AppController{
public $uses = array('Class');
public function view($id){
$class = $this->Class->find('first', array('conditions' => array('Class.id' => $id));
$this->set('class', $class);
}
}
<?php echo $class['Country']['name']?>
您可能会发现必须配置类模型的recursive
参数,以便CakePHP检索所有关联数据。这可以通过以下两种方式之一完成:
recursive
模型中配置Class
参数(有关如何执行此操作,请参阅documentation)。每当您从数据库中检索记录并且未在选项中指定属性时,这将设置recursive
的默认值。recurisve
方法调用中设置find(...)
参数。我赞成这个,因为当你不需要它检索的数据时,它有助于避免在数据库上造成沉重的负担。例如,在您的控制器中,您可以执行以下操作:
public function view($id){
$class = $this->Class->find('first', array('conditions' => array('Class.id' => $id), 'recursive' => 3));
$this->set('class', $class);
}
只是一个警告,不要将recursive
设置为高于您需要的值,否则您可能会检索不特别需要的内容。使用debug()
功能检查您当前正在检索的模型,以便您做出更明智的决定:
debug($class);
我希望这有一些帮助!