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'
)
);
}
现在我的问题是:
- 为什么从关系中返回了错误的城市?
- 如何查看针对我的操作执行的 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 $id
的 Order
相关联(通过 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 插件以进一步了解。
另见
我正在处理一个旧项目,该项目由已离开公司的人编写,该项目是使用 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'
)
);
}
现在我的问题是:
- 为什么从关系中返回了错误的城市?
- 如何查看针对我的操作执行的 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 $id
的 Order
相关联(通过 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 插件以进一步了解。
另见