问题描述
我正在尝试用 L@R_502_6460@vel eloquent 替换 MysqL 查询。这是我的结构。
Consumers Table
---------------
id,email,name
Transactions Table
-------------------
id,consumer_id,value,bonus_value
我想要实现的输出
id,name,total_value
1,[email protected],Al,11000
2,[email protected],Bl,200000
/**
* Transactions Relationship
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function transactions(){
return $this->hasMany(Transaction::class,'consumer_id');
}
这是我迄今为止编写的查询。
$query = Consumer::query()
->join('consumer_transactions AS ct',function($q) {
$q->on('consumers.id','=','ct.consumer_id')
->where('ct.status','processed')
->where('ct.approved',1)
->select(DB::raw('SUM(ct.value + ct.bonus_value) AS total_points'))
;
})
->whereIn('consumers.id',$consumerIds)
->get()
;
它不返回 total_points
解决方法
Join Clause 传递给您的 join take Illuminate\Database\Query\JoinClause
女巫没有名为“select”的方法。
你 select
应该不在 join 子句中。
$query = Consumer::query()
->join('consumer_transactions AS ct',function($q) {
$q->on('consumers.id','=','ct.consumer_id')
->where('ct.status','processed')
->where('ct.approved',1);
})
->select( ['consumers.*',DB::raw('SUM(ct.value + ct.bonus_value) AS total_points')])
->whereIn('consumers.id',$consumerIds)
->get();
,
我不喜欢加入桌子。这就是为什么我可以为您提供不同的方法。
$consumers = Consumer::whereIn('id',$consumerIds)
->with(['transactions' => function($query) {
$query
->where('startus','processed')
->where('approved',1)
}])->get()
->map(function($item,$key) {
return $item->total_points = $item->transactions->value + $item->transactions->bonus_value
});