#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();