找到(' all')在CakePHP中进行意外(不需要的)SQL连接

时间:2014-03-14 04:46:44

标签: cakephp

我设置了两个模型:城市和国家。以下是我如何定义它们:

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

class Country extends AppModel { // for "countries" table
    public $hasMany = array(
        'City' => array(
            'className' => 'City'
        )
    );
}

并在我的控制器中:

public function getCities() {
  $this->loadModel('City');
  $cities = $this->City->find('all');
}

但它给了我这个错误:

Database Error

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Country.city_id' in 'on clause'

SQL Query: SELECT `City`.`id`, `City`.`country_id`, `City`.`name`, `City`.`latitude`, `City`.`longitude`, `City`.`time_zone`, `City`.`dma_id`, `City`.`code`, `City`.`created`, `City`.`modified`, `Country`.`id`, `Country`.`country_id`, `Country`.`name`, `Country`.`code`, `Country`.`created`, `Country`.`modified` FROM `rtynbiz_ls`.`cities` AS `City` LEFT JOIN `rtynbiz_ls`.`countries` AS `Country` ON (`Country`.`city_id` = `City`.`id`) WHERE 1 = 1

Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp

我无法理解为什么它试图与Country表进行连接。我只想取城。我如何阻止这种情况发生?并且,为什么它尝试使用Country.city_id(它不存在)进行关联另外,我是否正确地命名了我的类和表?感谢

3 个答案:

答案 0 :(得分:0)

以下代码行正在建立关系,因此JOIN存在于那里。要从查询中删除JOIN,只需替换:

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

class Country extends AppModel { // for "countries" table
    public $hasMany = array(
        'City' => array(
            'className' => 'City'
        )
    );
}

使用:

  class City extends AppModel { }// for "cities" table

  class Country extends AppModel {} // for "countries" table

您可以按照this

轻松地在表格中建立关系

答案 1 :(得分:0)

默认情况下,CakePHP会自动尝试提取其他模型的数据。要阻止它成为默认值,请在AppModel中设置此变量:

public $recursive = -1;

我还建议添加可控行为,因此您的应用模型如下所示:

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

详细了解&#34;递归&#34;和&#34;可控行为&#34;在CakePHP book

答案 2 :(得分:0)

如果您想要检索数据不想加入,请将其递归-1

public function get_cities() {
     $this->loadModel('City');
     $this->City->recursive=-1;
     $cities = $this->City->find('all');
     //or
     $cities = $this->City->find('all', array('recursive'=>-1));
}

这将是你的模特:

class Country extends AppModel {
     public $hasMany = array(
        'City' => array(
            'className' => 'City',
            'foreignKey' => 'country_id',
            'dependent' => false,
        ),
     );
}

class City extends AppModel {
    public $belongsTo = array(
        'Country' => array(
            'className' => 'Country',
            'foreignKey' => 'country_id',
        )
    );
}

确保您在这两个型号上没有杂乱的代码