Объедините результаты запроса в Eloquent, используя один из столбцов - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть MySQL таблица с именем stock_history, которая выглядит примерно так:

id | date       | mnemonic      | value
---------------------------------------
1  | 2020-01-21 | IQ_CLOSEPRICE | 147.15
2  | 2020-01-22 | IQ_CLOSEPRICE | 149.31
3  | 2020-01-23 | IQ_CLOSEPRICE | 150.11
4  | 2020-01-21 | IQ_TRADES     | 323
5  | 2020-01-22 | IQ_TRADES     | 542
6  | 2020-01-22 | IQ_TRADES     | 712
7  | 2020-01-21 | IQ_PAYOUTS    | 23

Возможно ли построить запрос, который бы возвратил IQ_CLOSEPRICE и IQ_TRADES строк для диапазона дат с указанием даты?

Например, если я хочу получить IQ_CLOSEPRICE и IQ_TRADES для диапазона 2020-01-21 до 2020-01-22, он должен вернуть что-то вроде:

[
    '2020-01-21' => [
        'IQ_CLOSEPRICE' => 147.15,
        'IQ_TRADES' => 323
    ],
    '2020-01-22' => [
        'IQ_CLOSEPRICE' => 149.31,
        'IQ_TRADES' => 542
    ],
]

Конечно, легко вернуть данные в их естественной структуре, например:

StockHistory::where('date', '>=', '2020-01-21')
    ->where('date', '<=', '2020-01-22')
    ->whereIn('mnemonic', ('IQ_CLOSEPRICE', 'IQ_TRADES')
    ->get();

Но я бы хотел, чтобы Eloquent возвратил вышеуказанную структуру, чтобы избавить меня от циклического перемещения по всему списку. после получения результатов запроса, если это возможно. Если нет, то мы можем обойтись без указания даты, но было бы здорово по крайней мере поместить IQ_CLOSEPRICE и IQ_TRADES в один и тот же элемент массива, например:

[
    [
        'IQ_CLOSEPRICE' => 147.15,
        'IQ_TRADES' => 323,
        'date' => '2020-01-21'
    ],
    [
        'IQ_CLOSEPRICE' => 149.31,
        'IQ_TRADES' => 542
        'date' => '2020-01-22'
    ],
]

1 Ответ

2 голосов
/ 24 февраля 2020

Во-первых, что-то не так с кодом whereIn, попробуйте использовать массив:

->whereIn('mnemonic', ['IQ_CLOSEPRICE', 'IQ_TRADES'])

Во-вторых, вы можете использовать groupBy коллекции для группировки этих данных с date:

->get()->groupBy('date');

В-третьих, значение 'IQ_CLOSEPRICE', 'IQ_TRADES' не является именем столбца stock_history, есть значения столбцов mnemonic. Если вы хотите получить их в качестве ключа, вы можете использовать pluck , например, значение mnemonic будет ключом, а значение value будет значением:

->pluck('value', 'mnemonic'); // return ['IQ_CLOSEPRICE' => 147.15,...]

Итак, ваш код должен выглядеть так:

StockHistory::where('date', '>=', '2020-01-21')
    ->where('date', '<=', '2020-01-22')
    ->whereIn('mnemonic', ['IQ_CLOSEPRICE', 'IQ_TRADES'])
    ->get()
    ->groupBy('date')
    ->map(function($item) {
        return $item->pluck('value', 'mnemonic');
    })->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...