Выберите SUM из подзапроса при использовании whereHas в Laravel - PullRequest
0 голосов
/ 23 октября 2018

У меня есть 2 таблицы, customers и customer_invoices, и я хочу получить всех клиентов с условием в своих счетах и ​​выбрать определенные столбцы (Customers.id, Customers.last_name и сумму total_price счетов на каждого клиента), у меня есть этот запрос:

$result = Customer::whereHas('customerInvoices', function(Builder $q) {
            $q->where('customer_invoices.status', 1);
        })->select([
            'customers.id',
            'customers.last_name',
            \DB::raw('SUM(customer_invoices.total_price) as sum')
        ])->get();

customerInvoices это отношение:

public function customerInvoices() {

    return $this->hasMany(CustomerInvoice::class);
}

Я хочу использовать подзапросы вместо объединений, поэтомуздесь я не могу выбрать это \DB::raw('SUM(customer_invoices.total_price) as sum'), иначе я получаю эту ошибку, конечно:

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'customer_invoices.total_price' in 'field list' (SQL: select `customers`.`id`, `customers`.`last_name`, SUM(customer_invoices.total_price) as sum from `customers` where exists (select * from `customer_invoices` where `customers`.`id` = `customer_invoices`.`customer_id` and `customer_invoices`.`status` = 1))"

Как мне добиться этого без использования объединений?

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать withCount(), чтобы получить сумму из связанной модели как

$result = Customer::select([
            'customers.id',
            'customers.last_name'
        ])->withCount([
            'customerInvoices as invoice_sum' => function($query) {
                $query->select(DB::raw('SUM(total_price)'));
            }
        ])->whereHas('customerInvoices', function(Builder $q) {
            $q->where('customer_invoices.status', 1);
        })->get();

Еще один подход для получения суммы, вы можете определить отношение hasOne() в вашей модели клиента, например:

public function invoice_sum()
{
    return $this->hasOne(CustomerInvoice::class)
        ->select('customer_id',
            DB::raw('sum(total_price)')
        )->groupBy('customer_id');
}

И в построителе запросов

$result = Customer::select([
            'customers.id',
            'customers.last_name',
        ])->with('invoice_sum')
          ->whereHas('customerInvoices', function(Builder $q) {
            $q->where('customer_invoices.status', 1);
        })->get();      

В соответствии с Eloquent: withCount () переопределяет столбцы $ при получении get () , сначала поставьте select() mehtodа затем используйте with() function

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