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 雄辩的关系查询的主要内容,如果未能解决你的问题,请参考以下文章