3

所以这是我最新的问题:我在我的 Cakephp 控制器中运行这个查询:

$acctRenewLast2Entries = $this->AccountRenew->find
    (
        'all',
        array
        (
            'conditions' => array('Acc_Id' => $plan["Account"]["Acc_Id"]),
            'order' => array('AccR_Id' => 'DESC')
        )
    );

我期待这条 SQL 语句有 4 条记录。相反,在我的控制器中运行调试时,这是我为上面的每一行得到的(见第一条记录):

app/controllers/admins_controller.php (line 2584)

1

app/controllers/admins_controller.php (line 2584)

Array
(
    [AccountRenew] => Array
        (
            [AccR_Id] => 470
            [AccR_Date] => 2012-06-23 01:21:11
            [AccR_Hstart_Date] => 2012-06-23 01:21:11
            [AccR_Hend_Date] => 2012-08-23 01:21:11
            [AccR_End_Date] => 2013-08-23 01:21:11
            [AccR_Status] => PAID
            [AccR_Reason] => RENEWAL
            [Inv_Id] => 467
            [Inac_Id] => 
            [Acc_Id] => 196
            [AccT_Id] => 44
            [Amount] => 16
            [AccP_Id] => 0
        )

)

app/controllers/admins_controller.php (line 2584)

Array
(
    [AccountRenew] => Array
        (
            [AccR_Id] => 465
            [AccR_Date] => 2012-06-23 01:17:35
            [AccR_Hstart_Date] => 2012-06-23 01:17:35
            [AccR_Hend_Date] => 2012-07-23 01:17:35
            [AccR_End_Date] => 2012-07-23 01:17:35
            [AccR_Status] => PAID
            [AccR_Reason] => RENEWAL
            [Inv_Id] => 462
            [Inac_Id] => 
            [Acc_Id] => 196
            [AccT_Id] => 41
            [Amount] => 16
            [AccP_Id] => 0
        )

)

app/controllers/admins_controller.php (line 2584)

Array
(
    [AccountRenew] => Array
        (
            [AccR_Id] => 269
            [AccR_Date] => 2012-06-06 10:15:56
            [AccR_Hstart_Date] => 2012-06-06 17:15:56
            [AccR_Hend_Date] => 2012-06-20 17:15:56
            [AccR_End_Date] => 2012-06-20 10:15:56
            [AccR_Status] => TRIAL
            [AccR_Reason] => 
            [Inv_Id] => 0
            [Inac_Id] => 
            [Acc_Id] => 196
            [AccT_Id] => 0
            [Amount] => 0
            [AccP_Id] => 0
         )

)

现在,当我运行 sql_dump 时,我得到以下运行的查询:

SELECT `AccountRenew`.`AccR_Id`, `AccountRenew`.`AccR_Date`, `AccountRenew`.`AccR_Hstart_Date`, `AccountRenew`.`AccR_Hend_Date`, `AccountRenew`.`AccR_End_Date`, `AccountRenew`.`AccR_Status`, `AccountRenew`.`AccR_Reason`, `AccountRenew`.`Inv_Id`, `AccountRenew`.`Inac_Id`, `AccountRenew`.`Acc_Id`, `AccountRenew`.`AccT_Id`, `AccountRenew`.`Amount`, `AccountRenew`.`AccP_Id` FROM `account_renews` AS `AccountRenew` WHERE `Acc_Id` = 196 ORDER BY `AccR_Id` DESC       4   4   

当我在 MySQL 中运行上述查询时,我确实得到了所有 4 条记录,包括数组中显示为 1 的第一条记录(在我的文章顶部)。

我真诚地希望有人可以提供帮助,因为我在过去的 1.5 天里没有任何运气来解释为什么 MySQL 会提取完整的集合,但 Cake 似乎只检索最后 3 个,并将第一条记录替换为“1”的数组”。

提前致谢!

4

3 回答 3

1

@user996302 这个问题似乎与您指出的我的一张Cake Lighthouse 票有联系。

@GMOAdmin我怀疑您的模型名称可能有问题,因为“更新”一词是动词,并且由于它没有复数形式,因此这可能会以某种方式阻碍 CakePHP 约定,因为Inflector 类可能无法翻译这个。
正确的名词是renews,它是复数形式:renews。您可以尝试重命名(根据惯例)数据库表、模型 - 名称和类名、控制器 - 名称和类名,看看是否有效。

您可以通过以下 Inflector 方法测试 Inflector 是否正确处理此问题:

Inflector::pluralize($singular) , Inflector::classify($tableName) , Inflector::tableize($camelCase)

一个快速的解决方法是使用这种方式发出工作查询,$this->ModelName->query($queryToRun);您可以解决这个问题,因为正如您所说,查询在数据库上运行时可以正确运行。总的来说,这是一个真正有趣的问题,我建议你让 CakeCore 团队看看——如果它是可重现的,那么这是一个 BUG,它需要修复。

于 2012-07-30T09:44:30.283 回答
0

很奇怪的问题。

我不知道发生了什么,但我最近阅读了一个错误报告,听起来很像你的问题:

您可以按照作者的建议尝试:将参数 $showHTML ( cake docs ) 设为 true:

debug($var, true, true);

希望有帮助。

于 2012-07-27T00:09:27.203 回答
0

好吧,我想我已经找到了答案。至少,这给我带来了问题。

CakePHP counterCache

我有什么:

public $hasMany = array(
    'Flight' => array(
        'className' => 'Flight',
        'foreignKey' => 'user_plane_id',
        'counterCache' => true
     )
);

非常愚蠢,但确实导致了问题。所以也许你也有一个 counterCache ?或者,也许你在关系中设置了另一个错误?

如果您在我的代码片段中没有看到问题。我应该添加counterCache$belongsTo而不是$hasMany。所以它会是这样的:

public $belongsTo = array(
    'UserPlane' => array(
        'className' => 'UserPlane',
        'foreignKey' => 'user_plane_id',
        'counterCache' => true
    )
);

注意:我运行的是 CakePHP 2.x 而不是 1.3!

于 2013-01-12T22:24:23.543 回答