laravel 雄辩的关系查询

Posted

技术标签:

【中文标题】laravel 雄辩的关系查询【英文标题】:laravel eloquent query with relations 【发布时间】:2021-06-17 15:06:51 【问题描述】:

我正在尝试用 laravel eloquent 替换 mysql 查询。这是我的结构。

Consumers Table
---------------
id, email, name

Transactions Table
-------------------
id, consumer_id, value, bonus_value

我想要达到的输出

id, email, name, total_value
1, abc@123.com, Al, 11000
2, abc2@123.com, 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

【问题讨论】:

【参考方案1】:

Join Clause 传递给你的 join take Illuminate\Database\Query\JoinClause 女巫没有名为“选择”的方法。

select 应该不在连接子句中。

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

【讨论】:

只显示一条记录,将所有消费者的所有交易价值相加。我想分别显示每个消费者的交易价值。 尝试使用 leftJoin 代替 join【参考方案2】:

我不喜欢加入表格。这就是为什么我可以为您提供不同的方法。

$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
                );

【讨论】:

是的,但我想添加一个比较总点数的 where 子句,例如 ->where('ct.total_points', '>', 5000); 我该怎么做? 可以在map()之后添加filter()函数。 laravel.com/docs/8.x/collections#method-filter

以上是关于laravel 雄辩的关系查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 雄辩的 ORM 关系查询

Laravel 查询构建器与雄辩的关系

Laravel 通过属性获得雄辩的查询构建器关系

在 Laravel 中通过 ajax 加载更雄辩的 hasMany 关系查询?

Laravel 雄辩与查询构建器的优缺点

雄辩的关系 laravel