加入 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的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 加入分页

加入laravel 5.5 [重复]

Mailchimp 选择加入 Laravel 4 教程?

Laravel 加入以检索总数

加入彼此不相关的表laravel

Laravel 5.4“加入”查询