【问题标题】:How to use Laravel Eloquent with complex queries如何使用 Laravel Eloquent 处理复杂的查询
【发布时间】:2018-02-02 21:30:18
【问题描述】:

我正在尝试为我们正在开发的新 API 设置 Eloquent。我在模型中使用关系。

有些关系很复杂,并不真正适合快速链接的查询生成器语句。例如,我正在尝试返回指标,其中一些指标很复杂。比如统计一个用户产生的总点击次数(不只是简单的COUNT(*))。这是我现在拥有的代码:

<?php

namespace App\Models\Eloquent;

use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class Affiliate extends Model
{

    protected $table = 'user';

    public function profile()
    {
        return $this->belongsTo('App\Models\Eloquent\Profile', 'id');
    }

    public static function clicks()
    {

        $sql = "SELECT 
                   user_id,
                   COUNT(*) / SUM(dummy_metric) AS total_clicks
                FROM clicks
                WHERE something = 'true' 
                     AND another_thing > 100 # dummy filter for example only
                GROUP BY user_id";

        $rows = DB::select(DB::raw($sql));

        // (PSUEDO CODE) THIS IS WHAT I'D LIKE TO DO IDEALY
        return $this->belongsTo($rows, user_id);

    }

可能吗?我希望能够编写我们自己的查询而不总是依赖查询生成器,但我仍然希望能够加入与 Eloquent 的关系。

【问题讨论】:

  • 如果我理解正确,您想将原始 SQL 转换为 Eloquent 查询吗?
  • @jaysingkar 是的。我们有大量的查询,我想以某种方式将它们集成到 Eloquent 中。
  • 这样的? Click::select(DB:raw("user_id, COUNT(*) / SUM(dummy_metric) AS total_clicks"))-&gt;where(/*condition*/)-&gt;groupBy("user_id")-&gt;get(); 。假设您定义了 Clicks 模型
  • where 方法接受条件数组,因此您可以在相同的 where 方法中添加更多条件
  • @jaysingkar 我明白了。我想我不熟悉如何决定Clicks。我会为包含belongsTo 并包含use App\Models\Eloquent\Click; 的点击创建一个新模型吗?

标签: laravel eloquent


【解决方案1】:

假设您定义了 Clicks 模型,请在下面找到您的查询的 eloquent 版本。

Click::select(DB:raw("user_id, COUNT(*) / SUM(dummy_metric) AS total_clicks"))
        ->where(/*condition*/)->groupBy("user_id")->get();

注意:
1) Where 方法接受一组条件,因此您可以在同一方法中添加多个条件。 Reference

更新

我认为 thius 应该是你的 clicks() 方法:

public function clicks(){
    return $this->hasMany('App\Models\Eloquent\Click',/*relevant ids*/);
}

而且,现在您想要计算点击次数(例如在控制器中),您可以使用以下查询:

$user = User::find("user_id")->with('clicks')->get();
$clicks = $user->clicks()->count();

为了提高效率,请参考Tweaking Eloquent relations上的这篇文章

更新 2:

您可以使用Accessor 函数来检索总数
User 模型中添加以下2 个方法。(将clicksCount 字符串更改为您需要的任何内容)

public function clicksCount(){
    return $this->hasOne('App\Models\Eloquent\Click')
                ->select(DB:raw("user_id, COUNT(*) count"))
                ->groupBy("user_id");
}

public function getClicksCountAttribute(){
    return $this->clicksCount->count();
}

现在,您可以使用$user-&gt;clicksCount; 直接获取计数。

如果你使用的是 Laravel 5.4,你可以使用withCount() 方法轻松检索计数。 Counting Related Models

【讨论】:

  • pastebin.com/Dx96yPsKpastebin.com/P6mjENKx 这样的东西?
  • @AlexMarkov 检查更新,您的User 模型可能会为clicks 方法抛出错误,因为它没有返回关系。如果此更新解决了您的查询,请告诉我
  • 不幸的是,由于我正在使用的库,这对我不起作用。是否可以直接在我的 Click 模型中创建与该查询的关系?
  • @AlexMarkov 抱歉,它不起作用。检查新的更新
猜你喜欢
  • 2013-05-30
  • 2015-12-06
  • 2021-11-16
  • 2014-08-18
  • 2015-05-16
  • 2021-02-02
  • 2019-02-15
  • 2020-08-05
  • 2017-07-11
相关资源
最近更新 更多