CakePHP 模型属于 SQL 查询

CakePHP Model belongsTo SQL Query

我正在处理一个旧项目,该项目由已离开公司的人编写,该项目是使用 CakePHP 2.4.0 制作的,我对 CakePHP 不是很熟悉。

我遇到了一个奇怪的问题,其中 belongsTo returns 条目错误。我有三个表,Orders、Deals 和 Cities,它们具有以下结构。

订单

+----+---------+
| 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 查询?

我尝试获取模型的数据源,但它returns 是一个空日志。

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

订单控制器

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

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

如果您希望 City 的名称与具有 ID $idOrder 相关联(通过 Deal),那么您要么需要查询$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'];

或在 City 模型上查询并包括通过关联表限制记录的所需联接。

如果您想查看生成的查询,请在您的 app/Config/core.php 中启用调试模式,并安装 Debug Kit 插件以进一步了解。

另见