如何从CakePHP中的hasMany关系中获取行

时间:2014-03-14 06:30:57

标签: cakephp

我有以下型号:

class AppModel extends Model {
    public $actsAs = array('Containable');
    public $recursive = -1;
}

class City extends AppModel { // for "cities" table
    public $belongsTo = 'Country';
}

class Country extends AppModel { // for "countries" table
    public $hasMany = 'City';
}

..如何获取某个国家/地区的城市。我正试图找出这样的事情:

$countries = $this->Country->first(); // fetch a country
$cities = $country->city->find('all'); // get the cities for that country

我已经以这种方式设置AppModel,以避免每次呼叫一个国家时都取城。有时我不需要检索所有城市,因此不需要默认连接。但是,有时候我确实想要为某个国家取得城市。以下是我了解的唯一方法:

$cities = City->find('all', array(
    'conditions' => array(
        'City.country_id' => $country['Country']['id']
    )
))

一旦在模型中建立了关系,这是访问城市的最便捷方式吗?如果是这样,我真的不明白为什么要烦扰$ belongsTo和/或$ hasMany。感谢

2 个答案:

答案 0 :(得分:0)

当您使用CakePHP Model关系时,则不需要编写Join查询。

首先在国家模型中添加以下内容

   class Country extends AppModel { // for "countries" table
       public $recursive = 1;
       public $hasMany = 'City';
   }

只需编写以下代码,

   $countries = $this->Country->find('all');

您可以以数组格式从$ country获取城市。

答案 1 :(得分:0)

关联模型首先会找到主模型,然后会根据第一个查询找到关联模型。因此,根据相关的模型条件限制它们是不可能的。因此,如果您想根据相关模型限制主模型,您有两个选择:

  • 执行Join查找
  • 做反向查找。这意味着您可以根据条件查找City,并包含与其关联的Country。例如(假设您在CountriesController上):

    $this->Country->City->find('all', array(
        'conditions' => array(
            //your conditions
        ),
        'contain' => array('Country')
    ));