Laravel 雄辩查询与关系

问题描述

我正在尝试用 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

这是我在 Consumer.PHP添加内容

/**
     * 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
                });