Yii2 разница результатов расчета двух столбцов - PullRequest
0 голосов
/ 10 марта 2020

Я не могу найти решение, связанное с проблемой, которую, как мне казалось, было легче решить. У меня есть два столбца с цифрами c значения INT (5) и в третьем я должен получить результат разницы для каждой отдельной строки курса.

Я взял подсказку из решения по сложению на это ссылка , но возвращается в (без значения) для каждой строки.

В модели Sistop. php:

public function getDiff()
{
    $this->diff = 0;

    if (is_numeric($this->qdsistop) && is_numeric($this->qusistop)) {
        $this->diff = $this->qdsistop - $this->qusistop;
    }

    return $this->diff;
}

В SistopSearch. php

class SistopSearch extends Sistop
{

    public function attributes()
    {
        return array_merge(parent::attributes(), ['diff']);
    }

......

   public function search($params)
    {
        $query = Sistop::find()->select('*, (`qdsistop` - `qusistop`) AS `diff`');
        // add conditions that should always apply here
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        // enable sorting for the related columns
        $dataProvider->sort->attributes['diff'] = [
            'asc' => ['diff' => SORT_ASC],
            'desc' => ['diff' => SORT_DESC],
        ];


.....
        if (is_numeric($this->diff)) {
            $query->having([
                'diff' => $this->diff,
            ]);
        }

Результат один и тот же: (без значения) для каждой строки.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 марта 2020

Используйте addSelect с входными аргументами массива:

$query = Sistop::find();
$query->addSelect(['([[qdsistop]] - [[qusistop]]) AS [[diff]]']);

// more examples:
$query->addSelect(['SUM(amount) AS total_annual', 'IF(val > 0, 1, 0) AS is_selected']);
$query->addSelect(['DATE_FORMAT(date_created,'%Y-%m') AS yymm']);
$query->andWhere("[[diff]] >= :limit", [':limit' => 100]);
$query->addGroupBy(['is_selected', 'yymm']);
$query->orderBy(['diff' => SORT_DESC])

См. Руководство Yii2 .

...