我正在尝试为我们正在处理的新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的关系。
答案 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