Конвертировать SQL в Laravel Eloquent - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над несколькими таблицами, которые связаны довольно сложными отношениями (которые я пытаюсь очистить, но мне все еще нужны отчеты, сделанные из данных через мой Laravel).

В настоящее время я могу получить данные, используя следующий запрос SQL, в свою базу данных MySQL:

SELECT
customers.id,
customers.customer_name,
SUM(shipments.balance) AS shipmentBalance

FROM customers

LEFT JOIN shipments 
ON customers.id = shipments.bill_to  
AND balance > (SELECT IFNULL(SUM(payments_distributions.amount),0)                
    FROM payments_distributions               
    WHERE payments_distributions.shipment_id = pro_number)
GROUP BY customers.id, customers.customer_name
ORDER BY shipmentBalance DESC
LIMIT 5;

Я просто не уверен, как правильно переписать его в операторы whereRaw или DB :: raw, которые требуются Laravel Eloquent, поскольку мои предыдущие попытки потерпели неудачу.

Обновление

Вот наиболее близкое решение, которое я пробовал:

DB::table('customers')
        ->select('customers', DB::raw('SUM(shipments.balance) AS shipmentBalance'))
        ->leftJoin(
                 DB::raw('
                        (select shipments 
                        ON customers.id = shipments.bill_to
                        AND balance > (SELECT IFNULL(SUM(payments_distributions.amount),0) 
                            FROM payments_distributions 
                            WHERE payments_distributions.shipment_id = pro_number)'))
        ->groupBy('customers.id')
        ->orderByRaw('shipmentBalance DESC')
        ->limit(5)
        ->get();

Обновление 2

Редактировать для Dom:

Используя все как есть с вашим ответом, я получаю следующий ответ:

SQLSTATE[42S22]: Column not found: 1054 Unknown column '' in 'on clause' (SQL: select customers.id, customers.customer_name,SUM(s.balance) AS shipmentBalance from `customers` left join `shipments` as `s` on `customers`.`id` = `s`.`bill_to` and s.balance > (SELECT IFNULL(SUM(payments_distributions.amount),0) FROM payments_distributions WHERE payments_distributions.shipment_id = s.pro_number) = `` group by `customers`.`id`, `customers`.`customer_name` order by SUM(s.balance) DESC limit 5)

Но если я удалю этот раздел, он откроет страницу и клиентов (хотя и в неправильном порядке, поскольку я удалил один из необходимых компонентов:

$join->on(DB::raw('s.balance > 
            (SELECT IFNULL(SUM(payments_distributions.amount),0)                
            FROM payments_distributions               
            WHERE payments_distributions.shipment_id = s.pro_number)
                                            ')); 

Могу ли я вам чем-то помочь, чтобы это конкретное утверждение работало с вашим полным ответом?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Используйте это:

DB::table('customers')
    ->select('customers.id', 'customers.customer_name', DB::raw('SUM(shipments.balance) AS shipmentBalance'))
    ->leftJoin('shipments', function($join) {
        $join->on('customers.id', 'shipments.bill_to')
            ->where('balance', '>', function($query) {
                $query->selectRaw('IFNULL(SUM(payments_distributions.amount),0)')
                    ->from('payments_distributions')
                    ->where('payments_distributions.shipment_id', DB::raw('pro_number'));
            });
    })
    ->groupBy('customers.id', 'customers.customer_name')
    ->orderByDesc('shipmentBalance')
    ->limit(5)
    ->get();
0 голосов
/ 27 апреля 2018

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

Преимущество, начиная с модели Customer, заключается в том, что у вас будет коллекция laravel и вы сможете paginate при необходимости. Также просмотрите eloquent docs , они помогут вам понять все различные варианты. Надеюсь, это поможет.

P.S. Начните с использования вашей модели в вашем контроллере или там, где вы размещаете этот запрос:

use App\Customer

Запрос

$theQuery = Customer::select(DB::raw('customers.id, customers.customer_name,SUM(s.balance) AS shipmentBalance'))
        ->leftJoin('shipments as s', function($join)
        {
            $join->on('customers.id', '=', 's.bill_to');
            $join->on(DB::raw('s.balance > 
                                (SELECT IFNULL(SUM(payments_distributions.amount),0)                
                                    FROM payments_distributions               
                                    WHERE payments_distributions.shipment_id = s.pro_number)
                            '));    
        })
        ->groupBy('customers.id', 'customers.customer_name')
        ->orderByRaw('SUM(s.balance) DESC')
        ->limit(5)
        ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...