cakePHP - 模型关系

时间:2013-06-07 15:35:43

标签: cakephp models database-relations

我正在为巴西的一所大学开发一个系统。在这个系统中,我有以下模型: - 国家; - 国家; - 城市; - 大学; - 单位; - 班级;

确定。关系是: - 国家属于国家; - 城市属于国家; - 大学属于国家(因为,在我的数据库中,并非每个国家都有注册的国家,并非每个州都有城市注册,所以我不能要求用户将大学注册到城市); - 单位属于大学; - 班级属于大学(因为并非每所大学都有注册单位);

确定。我想现在我已经为你们了解我的情况设置了一个很好的背景。现在问题本身:

在我的模型类视图中,我想显示国家和(如果有州城)。我可能需要在其他模型视图中显示此类内容,例如Unit和University。

但是当我尝试在我的Class模型中执行此操作时,我只能显示country_id。我大学数据库表中的外键。那是为什么呢,那是因为我的班级模型属于大学,因此访问我大学的房产非常容易。但是我不想访问国家的ID,我想要它的名字。也许在将来我可能想要其他属性,谁知道?

我该怎么做?当我的模型类与它没有直接关系时,如何访问模型国家/地区的属性?

许多拥抱和亲吻。希望有人可以帮我这个。

P.S: 我已经管理了一个有点失败者的解决方案:在我的类控制器中,我已经完成了以下操作(因此我可以访问模型国家,州和城市的变量):

  • 在View功能中我加载了州和城市的模型(模型我可以通过关系Class-> University-> Country访问);
  • 然后我使用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怎么样?如果我不知道我和哪个班级合作,我该怎么办呢?我是否必须在视图中使用逻辑并查找方法?这不仅仅是弄乱了代码吗?

1 个答案:

答案 0 :(得分:1)

如果不发布代码,很难指出正确的方向。但是,假设您正确配置了模型,您应该能够执行以下操作:

ClassController.php

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);
    }
}

view.ctp

<?php echo $class['Country']['name']?>

您可能会发现必须配置类模型的recursive参数,以便CakePHP检索所有关联数据。这可以通过以下两种方式之一完成:

  1. recursive模型中配置Class参数(有关如何执行此操作,请参阅documentation)。每当您从数据库中检索记录并且未在选项中指定属性时,这将设置recursive的默认值。
  2. recurisve方法调用中设置find(...)参数。我赞成这个,因为当你不需要它检索的数据时,它有助于避免在数据库上造成沉重的负担。
  3. 例如,在您的控制器中,您可以执行以下操作:

    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);
    

    我希望这有一些帮助!