加入 Laravel 的 Eloquent
Posted
技术标签:
【中文标题】加入 Laravel 的 Eloquent【英文标题】:Join in Laravel's Eloquent 【发布时间】:2018-08-16 19:20:38 【问题描述】:我有一个访问模型,我得到了我想要的数据:
$app_visits = Visit::select([
'start',
'end',
'machine_name'
])->where('user_id', $chosen_id)->get();
但我想为每次访问加分。每次访问都有一个交互(但没有visit_id(因为其他系统无法添加)。
上一个开发者是这样离开的:
$interactions = Interaction::where([
'machine_name' => $app_visit->machine_name,
])->whereBetween('date', [$app_visit->start, $app_visit->end])->get();
$points = 0;
foreach ($interactions as $interaction)
$points += (int)$interaction->app_stage;
$app_visits[$key]['points'] = $points
但我真的不喜欢它,因为它又慢又乱。我只想在第一个查询中添加“点”总和,只触摸一次数据库。
@edit 有人询问数据库结构:
访问:
|id | start | end | machine_name | user_id
互动:
|id | time | machine_name | points
【问题讨论】:
发布你的数据库结构 【参考方案1】:你可以在 eloquent 中使用一些东西。对于这种情况,最有用的可能是select(DB::raw(sql...))
,因为您必须添加一些原始 sql 才能检索计数。
例如:
return $query
->join(...)
->where(...)
->select(DB::raw(
COUNT(DISTINCT res.id) AS count'
))
->groupBy(...);
如果做不到这一点,我只会用原始 sql 替换 eloquent。我们不得不这样做,因为我们的数据集非常庞大,而 eloquent 的模型构建被证明有点慢。
在添加结构时更新。为什么不根据machine_name
(甚至是使用计算点的原始sql的自定义方法)添加一个与交互的关系,并使用:Visits::with('interaction.visitPoints')->...blah
?
【讨论】:
好吧,我现在就试试。谢谢!【参考方案2】:看看 DB 而不是 Eloquent: https://laravel.com/docs/5.6/queries
用于更复杂和高效的查询。 也有可能在这个外观上使用原始 SQL。
【讨论】:
以上是关于加入 Laravel 的 Eloquent的主要内容,如果未能解决你的问题,请参考以下文章