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'
)
);
}
现在我的问题是:
- 为什么错误的城市从这种关系中归来?
- 如何查看执行的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插件。
也可以看看
- Cookbook > Core Libraries > Behaviors > Containable
- Cookbook > Models > Model Attributes > recursive
- Cookbook > Models > Associations: Linking Models Together > Joining tables
- Cookbook > Configuration > CakePHP Core Configuration
- Cookbook > Development > Debugging > Debug Kit
以上是关于CakePHP模型属于SQL查询的主要内容,如果未能解决你的问题,请参考以下文章
Cakephp SaveAssociated 和 Save - 使用相同的模型验证代码