CakePHP模型属于SQL查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CakePHP模型属于SQL查询相关的知识,希望对你有一定的参考价值。

我正在开发一个旧项目,该项目由不再在公司工作的人编写,该项目由Cakephp 2.4.0制作,我对CakePHP并不熟悉。

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

Orders

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

Deals

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

Cities

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

我已经尝试获取模型的数据源,但它返回一个空日志。

$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;
}
答案

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

如果你想要City的名字(通过Deal)和Order有ID $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'];

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

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

也可以看看

以上是关于CakePHP模型属于SQL查询的主要内容,如果未能解决你的问题,请参考以下文章

在cakephp中获取模型的sql查询

PHP CakePHP模型属于关联

CakePHP 中的多级模型关联

Cakephp SaveAssociated 和 Save - 使用相同的模型验证代码

尝试将 sql 查询详细说明到 cakephp 时总是出错;如何转换这个?

CakePHP中基于三级关系查询数据