как суммировать в подзапросе в laravel

#laravel #eloquent #query-builder

#laravel #красноречивый #конструктор запросов

Вопрос:

я хочу суммировать в функции addselect(), но она показывает мне ошибку. У меня есть 2 модели, как там:

1.Модель jewelItem:

 protected $table = 'jewel_items';

public function buyInvoice(){
    return $this->belongsTo(BuyInvoice::class,'buy_invoice_id');
}
 

2.buyInvoice модель:

 protected $table = 'buy_invoices';

public function jewelsItems(){
return $this->hasMany(JewelsItems::class);
}
 

и у каждого элемента jewelItem есть столбец weight.
мой запрос:

   $buyInvoice=BuyInvoice::addSelect(['allWeight'=>JewelsItem::whereColumn('buy_invoices.id','buy_invoice_id')->sum('weight')
        ])->get();
 

но это показывает мне эту ошибку:

 Column not found: 1054 Unknown column 'buy_invoices.id' in 'where clause' (SQL: select sum(`weight`) as aggregate from `jewel_items` where `buy_invoices`.`id` = `buy_invoice_id`)
 

как я могу это исправить, не используя метод Raw, потому что, как здесь сказано, «Необработанные операторы будут введены в запрос в виде строк», и это уязвимо.

Ответ №1:

В более новой версии laravel вы можете использовать withSum для получения суммы весов для связанных jewelsItems

 $buyInvoice=BuyInvoice::withSum('jewelsItems', 'weight')
                      ->orderBy('jewelsItems_sum_weight')
                      ->get();
 

Или в более старых версиях вы могли бы использовать withCount для sum как

  $buyInvoice= BuyInvoice::withCount([
                            'jewelsItems as allWeight' => function ($query) {
                                        $query->select(DB::raw("sum(weight)"));
                            }
                    ])->orderBy('allWeight')
                      ->get();
 

Комментарии:

1. Я получил новую ошибку: вызов неопределенного метода App Models BuyInvoice::withSum()

2. @yassin Итак, вы используете более старую версию, тогда попробуйте второй подход с помощью Count

3. но мой чувак. моя версия laravel framwork 8.0.0, так что она старая? и, как я уже сказал, я не хочу использовать необработанный метод, потому что он уязвим

Ответ №2:

вы забыли использовать join в этом подзапросе

 JewelsItem::whereColumn('buy_invoices.id','buy_invoice_id')->sum('weight')
 

Ответ №3:

Вместо выполнения пользовательского подзапроса count Laravel для этого используется синтаксический сахар, использующий метод withSum() . Примером этого может быть.

 $data = Model::query()->withSum('relation.subRelation','weight')->get();