Проблема с группой по laravel и sql - PullRequest
0 голосов
/ 16 мая 2019

Во-первых, у меня проблема с подсчетом продуктов, которые продаются каждый день.В SQL у меня есть запрос

select product_name, sum(quantity) as quantity from invoice_product 
join invoices on invoices.id = invoice_product.invoice_id
join products on products.id = invoice_product.product_id
 where invoices.issued_at = '2019-05-16' 
 and products.`made_by_us` = 1
 group by product_name

Это показывает мне интересную для меня информацию, но я использовал product_name, чтобы сделать group by, но я должен использовать product_id - мне тоже нужно показать имя, но я незнаете, как это сделать.

Во-вторых, я хочу использовать его в Laravel, так что, может быть, кто-то знает, как это можно сделать в Eloquent?

Заранее спасибо:)

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Я бы пошел с withCount() в сочетании с select(DB::raw()), например:

$products = Product::withCount(['invoices as quantity' => function ($query) {
    $query->select(DB::raw('sum(quantity)'));
}])->get();

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

$quantity = $products->first()->quantity;
1 голос
/ 16 мая 2019

Для достижения этой цели вам необходимо обновить отношения модели.

Модель:

InvoiceProduct Модель

class InvoiceProduct extends Model
{
    protected $table = 'invoice_product';

    protected $guarded = [
        'id',
    ];
}

public function invoice()
{
    return $this->belongsTo('App\Invoice'); // Assuming `Invoice` Model is directly in app folder
}

public function product()
{
    return $this->belongsTo('App\Product'); // Assuming `Product` Model is directly in app folder
}

Контроллер:

$full_query = InvoiceProduct::whereHas('invoice', function ($query) {
   return $query->where('issued_at', '2019-05-16');
})->whereHas('product', function ($query) {
   return $query->where('made_by_us', 1);
});

$product_names = $full_query->get(['product_name']);
$total_quantities = $full_query->sum('quantity');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...