【问题标题】:CakePHP: Load count of related Models with bindModelCakePHP:使用 bindModel 加载相关模型的计数
【发布时间】:2011-12-07 10:33:06
【问题描述】:

我有两个模型处于 1:n 关系,我只想加载相关项目的计数。

第一个是与“AdEvent”(许多)相关的表格/模型“Ad”(一个)。 AdEvents 有一个外键“ad_id”。

在控制器中我可以这样使用它,它会加载相关的 AdEvent 记录。

$this->Ad->bindModel(array('hasMany' => array(
    'AdEvent' => array(
        'className'    => 'AdEvent',
        'foreignKey'   => 'ad_id',
    ))));

现在我只需要没有数据的计数,我尝试使用参数“字段”和“分组”一个 COUNT() 语句,但在这种情况下结果为空。我也将关系更改为“hasOne”,但没有效果。

知道如何使用蛋糕魔法来做到这一点吗?

编辑: 使用简单的 SQL,它看起来像这样(我简化了它,a.id 而不是 a.*):

    SELECT a.id, COUNT(e.id) AS count_events
      FROM cake.admanager_ads AS a
      JOIN ad_events AS e ON e.ad_id = a.id
     GROUP BY a.id
     LIMIT 50;

【问题讨论】:

    标签: php sql cakephp model


    【解决方案1】:

    当然,您可以随时进行手动计数。这就是我几乎总是最终会做的事情,因为我几乎总是已经为其他目的加载了数据。

    $Ads = $this->Ad->find('all')
    foreach ($Ads as $Ad) {
        $NumAdEvents = array(
            $Ad['Ad']['id'] => sizeof($Ad['AdEvents']),
        )
    }
    debug($NumAdEvents);
    die;
    

    或者你可以使用 find('count'):

    $id_of_ad = 1; //insert your ad id here, or you can search by some other field
    $NumAdEventsAtOneAd = $this->AdEvent->find('count', array('conditions' => array(
        'AdEvent.ad_id' => $id_of_ad,
    )));
    debug($NumAdEventsAtOneAd);
    die;
    

    【讨论】:

    • find('count') 是 OP 正在寻找的。对某事的计数不是关联,它仍然只是来自原始模型的数字。
    • 我知道,但我尽量避免这样做,因为必须加载很多不需要的数据。
    • @oldskool:我需要“广告”的所有数据以及相关“广告事件”的计数。我可以使用一个简单的 SQL 查询,但要求是使用 cakemagic... :(
    • Dave,蛋糕查询通常分为两个部分:返回数据(例如广告标题和徽标)或返回元数据(例如计数)。获得一个查询在一个模型中返回数据而在另一个模型中返回计数将是非常难看的。除了数据,你真正的需求是什么?也许我们可以帮助重写您的要求。 IE。您是否针对 (1) 简单代码、(2) 快速响应、(3) 少量 mysql 查询、(4) 其他进行优化。根据您的需要,我有不同的解决方案。 “用 cakemagic 做”有点太模糊了。
    • 所以我无法通过一次查询检索所有数据?如何对“广告”列表进行排序以计算“广告事件”?
    猜你喜欢
    • 2012-02-06
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多