【问题标题】:cakephp find('all') not returning properlycakephp find('all') 没有正确返回
【发布时间】:2012-07-26 19:43:21
【问题描述】:

所以这是我的最新一期: 我在我的 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”。

提前致谢!

【问题讨论】:

  • 您尝试使用“列表”而不是“全部”吗?
  • 是的,我做到了。当我这样做时,我会返回一个索引数组,例如: Array ("480","470","465","269") 并且我很难将这些值从数组中取出。例如,我似乎无法将此数组的第二个值 (470) 分配给变量。有什么线索吗?
  • 我也试过 findAllBy 方法,结果和上面一样(第一条记录没有显示)....
  • 如果查询返回 4 行并且您看到 3(调试输出的代码不在问题中,这没有帮助) - 几乎可以肯定某些应用程序逻辑(在您的模型中) files) 正在处理删除/替换其中一行的结果。

标签: cakephp cakephp-1.3


【解决方案1】:

@user996302 这个问题似乎与你指出的我的Cake Lighthouse tickets 之一远程相关。

@GMOAdmin 我怀疑您的模型名称 the word "renew" is a verb 可能存在问题,并且由于它没有复数形式,这可能会以某种方式阻碍 CakePHP 约定,因为 Inflector class 可能无法翻译这个.
正确的名词是renewal,它是复数形式:renewals。您可以尝试重命名 (according to the convetions) 数据库表、模型 - 名称和类名、控制器 - 名称和类名,看看是否可行。

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

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

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

【讨论】:

  • 感谢您的建议。我在模型中尝试了“查询”选项,得到了同样奇怪的结果。我将研究名词与动词的问题,因为这是我第一次遇到这个建议。
  • 我研究了名词与动词,但实际上并不是这样,因为我在控制器中使用了相同的模型名称,而另一个 find('all') 工作得很好......会继续挖掘。
【解决方案2】:

很奇怪的问题。

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

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

debug($var, true, true);

希望对您有所帮助。

【讨论】:

    【解决方案3】:

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

    CakePHP counterCache

    我有什么:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多