CakePHP模型属于SQL查询

时间:2018-03-06 19:45:25

标签: php cakephp cakephp-2.3

我正在处理一个旧项目,该项目由不在公司的人编码,该项目已由CakePHP 2.4.0完成,我对CakePHP并不是非常熟悉

我遇到了一个奇怪的问题,其中belongsTo返回了错误的条目。我有三个表,订单,交易和城市,具有以下结构。

订单

+----+---------+
| id | deal_id |
+----+---------+
|  1 |       1 |
+----+---------+

优惠

+----+---------+
| id | city_id |
+----+---------+
|  1 |       2 |
+----+---------+

城市

+----+-----------+
| id |   name    |
+----+-----------+
|  1 | Montreal  |
|  2 | Toronto   |
|  3 | Ottawa    |
|  4 | Québec    |
|  5 | Vancouver |
|  6 | Calgary   |
|  7 | Halifax   |
+----+-----------+

OrdersController内,当我尝试检索城市名称时:

$this->Order->Deal->City->field('name');

我得到Calgary而不是预期的Toronto。因此,我查看了具有City.php属性的orders内部,这解释了为什么我接收Calgary因为它的订购由城市的name按升序排列。如果我将该媒体资源放入评论中,我会Montreal而不是Toronto,因为它不再按名称排序。

我知道我的交易有权city_id,因为当我执行以下操作时,我会2

$this->Order->Deal->field('city_id'); // 2

City.php

class City extends AppModel
{
    public $order = "City.name asc";
}

Deal.php

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

现在我的问题是:

  1. 为什么错误的城市从这种关系中归来?
  2. 如何查看已执行的SQL查询?
  3. 我已尝试获取模型的数据源,但它返回一个空日志。

    $log = $this->Order->Deal->getDataSource()->getLog(false, false);
    

    OrdersController

    public function passengers($id = 0)
    {
        $this->Order->id = $id;
        if (!$this->Order->exists()) {
            $this->redirect('/');
        }
    
        $name = $this->Order->Deal->City->field('name');
        var_dump($name); die;
    }
    

1 个答案:

答案 0 :(得分:2)

正如评论中已经提到的,Model::field()发出一个新查询来从数据库中检索单个字段,仅限于您调用该方法的模型,即它需要id开启要设置$this->Order->Deal->City,然后使用该ID查询City记录,它与关联或已检索的数据无关。

如果您希望关联City的名称(通过Deal)与ID为Order的{​​{1}},则您需要查询{{ 1}}并确保包含$id关联,或者设置了所需的$this->Order级别:

City

或查询recursive模型并包含通过关联表限制记录的必需连接。

如果您想查看生成的查询,请在$order = $this->Order->find('first', array( 'conditions' => array('id' => $id), 'contain' => 'Deal.City', // or // 'recursive' => 1 )); $name = $order['Deal']['City']['name']; 中启用调试模式,并进一步了解安装Debug Kit插件。

另见