Вычитание двух таблиц результатов Eloquent - PullRequest
0 голосов
/ 05 декабря 2018

С помощью Eloquent я получаю два таких результата из моей базы данных:

$deliveries = table1::select('place_id','product_id',DB::raw("SUM(amount) as amount"))->groupBy('place_id', 'product_id');

$purchases = table2::select('place_id','product_id',DB::raw("SUM(quantity) as amount"))->groupBy('place_id', 'product_id');

Я хочу получить таблицу, в которой все записи суммы в таблице2 вычитаются из таблицы1, если

place_id from table1 == place_id from table2 
AND 
product_id from table1 == product_id from table2

Я хочу использовать Eloquent, если это возможно, но я также в порядке с некоторым необработанным SQL внутри него или даже с некоторым быстрым php-array-method, чтобы сделать что-то вроде:

$inventory = $deliveries - $purchases;

отредактировано / добавлено

Так что сейчас я делаю это:

foreach ($deliveries as $delivery => $delivValue) {
        foreach ($purchases as $purchase => $purchValue) {
            if ($delivValue['place_id']==$purchValue['place_id'] && $delivValue['product_id']==$purchValue['product_id']) {
                $deliveries[$delivery]['amount'] = $delivValue['amount'] - $purchValue['amount'];
            }
        }
    }

Это работает, как и ожидалось, но я думаю, что это очень неэффективно, когда размеры массивов действительно увеличиваются.

1 Ответ

0 голосов
/ 05 декабря 2018

Я говорю, что это настолько близко, насколько это возможно, даже если вы используете вспомогательный метод laravel, такой как diff () и т. Д., Они все еще используют тот же подход внутри, поэтому лучше всего делать это на уровне базы данных

Попробуйте написать эту логику на уровне БД, например

DB::select('
    SELECT table1.place_id,table1.product_id,amount,quantity, amount-quantity 
    FROM table1 JOIN table2 
    ON (table1.place_id = table2.place_id 
                  and table1.product_id = table2.product_id)
'); 

http://sqlfiddle.com/#!9/2d5775/6/2

used DB :: select - при условии, что вы не принимаете никаких пользовательских данных

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