【问题标题】:cakePHP - model relationscakePHP - 模型关系
【发布时间】:2013-06-03 23:36:26
【问题描述】:

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

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

好的。我想现在我已经为你们了解我的情况奠定了良好的背景。现在谈谈问题本身:

在我的模型类的视图中,我想显示国家和(如果有州城市)。而且我可能需要在其他模型视图中显示这些内容,例如单元和大学。

但是当我尝试在我的 Class 模型中这样做时,我只能显示 country_id。我的大学数据库表中的外键。为什么会这样,那是因为我的 Class 模型属于 University,所以很容易访问我的 University 的属性。但是我不想访问国家的 id,我想要它的名字。也许将来我可能想要其他属性,谁知道呢?

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

很多拥抱和亲吻。希望有人能帮我解决这个问题。

附注: 我管理了一个失败的解决方案:在我的类控制器中,我完成了以下操作(所以我可以访问模型国家、州和城市的变量):

  • 在 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 中,我得到一个国家数据数组,一个国家数据数组和一个城市数据数组。在视图中,我检查 state 和 city 数组是否不是 length = 0 来显示它们和所有......但我认为必须有更好的方法来做到这一点。

附言:

另一个问题是……Index.ctp 呢?如果我不知道我正在与哪个班级一起工作,我将如何做到这一点?我必须有逻辑并在视图中查找方法吗?这不是乱码吗?

【问题讨论】:

    标签: cakephp models database-relations


    【解决方案1】:

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

    类控制器.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. 在您的Class 模型中配置recursive 参数(请参阅documentation 了解如何执行此操作)。每当您从数据库中检索记录并且未在选项中指定属性时,这都会为 recursive 设置默认值。
    2. find(...) 方法调用中设置recurisve 参数。我喜欢这个,因为当您不需要它检索的数据时,它有助于避免给数据库带来沉重的负担。

    例如,在您的控制器中,您可以执行以下操作:

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

    希望对你有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多