Как можно (SUM) в поле сводной таблицы и поиск этого поля в пакете yajra-laravel-datatable (laravel 5.6) - PullRequest
0 голосов
/ 27 апреля 2018

! есть три стола

  1. запасы введите описание изображения здесь
  2. склады введите описание изображения здесь
  3. inventory_has_warehouses введите описание изображения здесь

Я использую laravel yajra datatable. мне нужна сумма и поиск начальный_баланс это поле в инвентаризационные_хранилища сводная таблица

мой код:

    $id = Auth::user()->id;

        $row = Inventory::with('contact')->with('warehouse')
        ->select(
          'inventories.*',
          DB::raw('SUM(inventory_has_warehouses.starting_balance) as total') 
        )
        ->leftJoin('inventory_has_warehouses', 'inventory_has_warehouses.inventory_id', '=', 'inventories.id')
        ->leftJoin('warehouses', 'warehouses.id', '=', 'inventory_has_warehouses.warehouse_id')
        ->where('inventories.subscriber_id',$id)
        ->groupBy('inventories.id');

        $datatable = DataTables::of($row)

        ->filterColumn('total', function($query, $keyword) {
            $query->whereRaw('sum(inventory_has_warehouses.starting_balance) like ?', ['%'.$keyword.'%']);

        })

        return $datatable->make(true);

но я нашел этот тип ошибки

Сообщение об исключении: STSQLSTATE [HY000]: общая ошибка: 1111 Недопустимое использование групповой функции (SQL: выберите количество () как агрегат из (выберите inventories. , SUM (inventory_has_warehouses.starting_balance) как всего с inventories осталось присоединиться inventory_has_warehouses вкл inventory_has_warehouses. inventory_id = inventories. id осталось присоединиться warehouses к warehouses. id = inventory_has_warehouses. warehouse_id где inventories. subscriber_id = 2 и inventories. status = 1 и (НИЖЕ (inventories. itemcode) НРАВИТСЯ% 1% или НИЖНЯЯ (inventories. purchasedescription) НРАВИТСЯ% 1% или существует (выберите * с contacts, где inventories. supplier = contacts. id и LOWER (contacts. name) LIKE% 1%) или (сумма (inventory_has_warehouses.starting_balance) как% 1%)) сгруппировать по inventories. id) count_row_table)

MySQL запрос

выберите запасы., СУММА (inventory_has_warehouses.starting_balance) Всего из инвентаризации осталось присоединиться к inventory_has_warehouses на inventory_has_warehouses.inventory_id = inventoryories.id оставил соединение склады на warehouses.id = inventory_has_warehouses.warehouse_id где инвентаризация_свойства = 2 и инвентаризация.статус = 1 и (НИЖНЯЯ (инвентарь. Код) НРАВИТСЯ% 1% или НИЖНЯЯ (опись.покупкаописание) НРАВИТСЯ% 1% или существует (выберите * из контактов, где инвентаризации.supplier = contacts.id и НИЖНЯЯ (contacts.name) НРАВИТСЯ% 1%) или (сумма (inventory_has_warehouses.starting_balance) как% 1%)) сгруппировать по inventories.id

Ответы [ 2 ]

0 голосов
/ 02 мая 2018
$id = Auth::user()->id;
        $row = DB::table('inventories')->select('inventories.*','contacts.name',DB::raw('SUM(inventory_has_warehouses.starting_balance) as total'))
            ->leftJoin('contacts', 'inventories.supplier', '=', 'contacts.id')
            ->leftJoin('inventory_has_warehouses', 'inventories.id', '=', 'inventory_has_warehouses.inventory_id')
            ->where('inventories.subscriber_id',$id)
            ->groupBy('inventory_has_warehouses.inventory_id');

if ($keyword = $request->get('search')['value']) {
            $row->having(DB::raw('SUM(inventory_has_warehouses.starting_balance)'), 'like', '%'.$keyword.'%');
            $row->orHaving('inventories.itemcode', 'like', '%'.$keyword.'%');
            $row->orHaving('inventories.purchasedescription', 'like', '%'.$keyword.'%');
            $row->orHaving('contacts.name', 'like', '%'.$keyword.'%');
          }

$datatable = DataTables::of($row)

->filterColumn('total', function($query, $keyword) {
        })

return $datatable->make(true);
0 голосов
/ 27 апреля 2018

попытаться сгруппировать по инвентаризации_has_warehouses.inventory_id

Отредактированный ответ:

Вы действительно даете трудное время для того, чтобы кто-то прочитал ваш запрос и помог вам, но чтобы исправить ваш запрос, это переформатированный запрос с исправлениями:

SELECT 
inventories.*, 
SUM(inventory_has_warehouses.starting_balance) as total 
FROM
inventories LEFT JOIN inventory_has_warehouses 
ON 
inventory_has_warehouses.inventory_id = inventories.id LEFT JOIN warehouses 
ON
warehouses.id = inventory_has_warehouses.warehouse_id 
WHERE
inventories.subscriber_id = 2 
AND
inventories.status = 1 
AND
(LOWER(inventories.itemcode) LIKE '%1%' or LOWER(inventories.purchasedescription) 
LIKE '%1%' OR EXISTS 
(SELECT 
* 
FROM
contacts 
WHERE
inventories.supplier = contacts.id 
AND
LOWER(contacts.name) LIKE '%1%') 
OR
(SUM(inventory_has_warehouses.starting_balance) LIKE '%1%')) GROUP BY inventories.id

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

LIKE %1%

это утверждение ожидает строки и говорит только:

inventories.

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

select count() as aggregate

возможно, один из них решит, но после переформатирования вашего кода я сначала замечу синтаксическую ошибку, но это очень просто, может быть, вы можете начать с простого очень простого запроса, пока этот запрос может работать для вас:

SELECT 
    inventories.id AS inventory_id,
    warehouses.id,
    SUM(inventory_has_warehouses.starting_balance) AS total
    FROM
    inventories LEFT JOIN inventory_has_warehouses
    ON inventories.id = inventory_has_warehouses.inventory_id
    LEFT JOIN
    warehouses 
    ON warehouses.id = inventory_has_warehouses.warehouse_id
    GROUP BY
    inventory_has_warehouses.inventory_id

с этого начала добавляя условия одно за другим, пока ошибка не появится снова (сделайте это в окне запросов mysql, а не через код laravel), пока не знаете, как laravel обрабатывает запросы sql, но отправленный вами формат действительно вызовет ошибку, а также, если Если вы собираетесь разместить здесь вопрос, убедитесь, что он удобен для чтения, иначе кто-то может хлопнуть вас, потому что вам трудно читать код, который не отформатирован должным образом. ;)

еще одна вещь, которую я забыл - убедитесь, что инвентаризация - это первичный ключ этой таблицы, иначе это все равно приведет к ошибке. Для получения более подробной информации перейдите по этой ссылке https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

...