CakePHP Map/Reduce или альтернатива?

У меня есть таблица счетов и таблица строк. Я хочу иметь возможность вернуть общую сумму счета, когда получу список счетов в действии индекса. Поэтому я хотел бы вернуть поле Invoice, LineItems и общее значение поля LineItems.price как Total.

Текущий код индекса в контроллере генерируется по умолчанию.

public function index()
{
    $this->paginate = [
        'contain' => ['Clients', 'Users', 'LineItems']
    ];
    $this->set('invoices', $this->paginate($this->Invoices));
    $this->set('_serialize', ['invoices']);
}

Должен ли я создать карту и уменьшить для этого связанного элемента, чтобы получить общее количество, или есть лучший способ, возможно, расширить выбор, чтобы включить дополнительное поле. Я понял, как добавить выбор, но не как добавить его в качестве дополнительного поля. Если я перезапишу LineItems, я просто получу общее количество, а не другие данные.

Любые указатели на то, как уменьшить карту в этом случае для связанных данных или есть лучший способ?


person KaffineAddict    schedule 15.11.2015    source источник
comment
Что вы хотите уменьшить?   -  person skywalker    schedule 15.11.2015
comment
Ничего себе, я не могу поверить, что я сделал это, я отредактирую свой пост. Я хотел бы получить общую сумму счета в качестве дополнительного поля. Сумма ценового столбца для всех связанных LineItems   -  person KaffineAddict    schedule 15.11.2015
comment
Рассчитайте его before и добавьте его в поле таблицы, после чего вы сохраните счет, и вам не нужно будет каждый раз выполнять его сокращение.   -  person floriank    schedule 16.11.2015
comment
Итак, вы говорите, если я добавлю или удалю или добавлю элемент, чтобы добавить или вычесть из общего количества. Это сработало бы, но кажется, что это была бы ужасно нормализованная схема, если бы я фактически сохранял эту информацию дважды.   -  person KaffineAddict    schedule 16.11.2015


Ответы (1)


Я понял. Мне нужно использовать leftJoinWith и autoFields, чтобы получить желаемый результат. Это оставляет меня с LineItems и общей суммой для счета!

    $invoice = $this->Invoices->find('all', ['contain' =>
        ['Clients', 'Users', 'Payments', 'Payments.PaymentTypes', 'LineItems']]);

    $invoice->select(['total' => $invoice->func()->sum('LineItems.price')])
        ->leftJoinWith('LineItems')
        ->autoFields(true);
person KaffineAddict    schedule 15.11.2015