Получить сумму столбца - PullRequest
0 голосов
/ 20 апреля 2020

Я использую React-Admin, чтобы создать небольшое приложение для проверки инструментов и того, кто их позаимствовал.

У меня есть таблица инструментов с идентификатором, кодом, именем, состоянием и т. Д.

с использованием Список для его визуализации.

    <List {...props} filters={<ToolFilter />}>
        <Datagrid rowClick="edit">
            <TextField source="id" />
            <TextField source="code" label="Kód" />
            <TextField source="name" />
            <TextField source="state" />
            <NumberField source="free" />
            <DateField source="add_time" />
            <EditButton />
        </Datagrid>
    </List>

Чем у меня есть таблица B_tools, которая содержит данные заимствованных инструментов. у него есть id, userId, toolId, durationOfBorrow

Что я хочу сделать, это добавить столбец в список инструментов, чтобы SUMs durationOfBorrow из таблицы B_tool для каждого инструмента и отображать его в списке инструментов.

например, если у меня есть таблица B_tool:

id   userId   toolId   durationOfBorrow
1    1        1        7
2    1        1        7
3    2        2        2
4    1        2        2

Мне нужен список инструментов, чтобы он выглядел следующим образом:


id   code     name     state   durationOfBorrow
1    123      Drill    1       14 (7+7)
2    456      Wrench   1       4 (2+2)

Я попытался использовать Запрос API с выборкой из React-Admin документация. Я подготовил маршрут app.get ('/ api / tools / loancount: id', toolController.borrowCount); эта сумма возвращает сумму столбца:

borrowCount(req, res) {
        //console.log(req);  
        const filtry = JSON.parse(req.query.filter);
        console.log(filtry);



        const options = {
            attributes: [
                [sequelize.fn('sum', sequelize.col('time')), 'total_time'],
              ],
            raw: true,
            where: ({

            }),
            order: 
                []
            ,
        };


        if (typeof filtry.id !== "undefined") {
            options.where.id = filtry.id;
        }

        return B_tool
        .findAll(options)
            //console.log(user);
            //res.status(201).send(test); 
        .then(b_tool => {
            //console.log(user.rows);
            res.status(200).send(b_tool);
        })
        .catch(error => res.status(400).send(error));
    },

Но не знаю, как реализовать это, чтобы отобразить его в списке инструментов.

1 Ответ

0 голосов
/ 20 апреля 2020

Я понял.

Я создал элемент BorrowCount, который использует API / toolsborrow /: id запроса и возвращает total_time.

import React from 'react';
import { useQuery, Loading, Error } from 'react-admin';

const BorrowCount = ({ record }) => {

    const { data, loading, error } = useQuery({ 
        type: 'getOne',
        resource: 'toolsborrow',
        payload: { id: record.id }
    });

    if (loading) return <Loading />;
    if (error) return <Error />;
    if (!data) return null;
    console.log(data);
    return (
        data[0].total_time
    )
};

export default BorrowCount;

В API я вызываю новый контроллер:

app.get('/api/toolsborrow/:id', toolController.borrowCount);

И контроллер возвращает СУММУ время столбец, где ToolId равен id строки инструмента:

borrowCount(req, res) {
        const options = {
            attributes: [
                [Sequelize.fn('sum', Sequelize.col('time')), 'total_time'],
              ],
            raw: true,
            where: ({
                ToolId: req.params.id
            }),
            order: 
                []
            ,
        };


        return B_tool
        .findAll(options)
        .then(b_tool => {
            res.status(200).send(b_tool);
        })
        .catch(error => res.status(400).send(error));
    },

Наконец, я просто используйте этот новый элемент BorrowCount в списке инструментов:

    <List {...props} filters={<ToolFilter />}>
        <Datagrid rowClick="edit">
            <TextField source="id" />
            <TextField source="code" label="Kód" />
            <TextField source="name" />
            <TextField source="state" />
            <BorrowCount label="Total_sum"/>
            <NumberField source="free" />
            <DateField source="add_time" />
            <EditButton />
        </Datagrid>
    </List>

Если у кого-то есть более элегантное решение, оставьте его здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...