Laravel Non-N/A 个值的模型平均值

Laravel Model Average of Non-N/A Values

我正在寻找对 Laravel 中子模型的值进行平均的最佳方法,但忽略了一些值。我要计算平均值的列设置为 varchar,但包含 0 到 10 之间的数字或值 'N/A'。我需要在此列上计算两个平均值,一个忽略 'N/A' 值,一个将 'N/A' 值计为 0。我已经编写了如何计算平均值的函数,但我希望得到一些输入执行此操作的最佳方法。

我希望能够像这样调用这些函数:

    $web_scored_tq = $website->scored_tq;
    $web_uscored_tq = $website->unscored_tq;

函数:

public function scored_tq() {
    $valid_click_ads = $this->valid_click_ads;
    $total = 0;
    $num = 0;

    foreach ($valid_click_ads as $valid_click_ad) {
        if ($valid_click_ad->tq != "N/A") {
            $total += $valid_click_ad->tq;
            ++$num;
        }
    }

    $scored_tq = $total / $num;
}

public function unscored_tq() {
    $valid_click_ads = $this->valid_click_ads;
    $total = 0;
    $num = 0;

    foreach ($valid_click_ads as $valid_click_ad) {
        if ($valid_click_ad->tq != "N/A") {
            $total += $valid_click_ad->tq;
            ++$num;
        } else {
            ++$num;
        }
    }

    $unscored_tq = $total / $num;
}

我找到了laravel的模型getFooAttribute!我用它来将以下功能添加到我的网站模型中,现在可以调用 $website->scored_tq 或 $website->unscored_tq.

public function getScoredTqAttribute() {
    $valid_click_ads = $this->valid_click_ads;
    $total = 0;
    $num = 0;

    foreach ($valid_click_ads as $valid_click_ad) {
        if ($valid_click_ad->tq != -1) {
            $total += $valid_click_ad->tq;
            ++$num;
        }
    }

    if ( $num != 0 ) {
        $scored_tq = $total / $num;
    } else {
        $scored_tq = '-';
    }
    return $scored_tq;
}

public function getUnscoredTqAttribute() {
    $valid_click_ads = $this->valid_click_ads;
    $total = 0;
    $num = 0;

    foreach ($valid_click_ads as $valid_click_ad) {
        if ($valid_click_ad->tq != -1) {
            $total += $valid_click_ad->tq;
        }
        ++$num;
    }

    if ( $num != 0 ) {
        $unscored_tq = $total / $num;
    } else {
        $unscored_tq = '-';
    }
    return $unscored_tq;
}

我还将数据的结构更改为整数,其中 "N/A" 值更改为 -1。