如何在复杂查询中使用Laravel Eloquent

时间:2017-08-24 21:23:25

标签: laravel eloquent

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

某些关系很复杂,并不适合快速链接的Query Builder语句。例如,我正在尝试返回指标,其中一些指标很复杂。比如计算用户生成的总点击次数(它不仅仅是一个简单的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的关系。

1 个答案:

答案 0 :(得分:2)

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

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模型中添加以下两种方法。(将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->clicksCount;直接获取计数。

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