【发布时间】: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"))->where(/*condition*/)->groupBy("user_id")->get();。假设您定义了Clicks模型 -
where 方法接受条件数组,因此您可以在相同的 where 方法中添加更多条件
-
@jaysingkar 我明白了。我想我不熟悉如何决定
Clicks。我会为包含belongsTo并包含use App\Models\Eloquent\Click;的点击创建一个新模型吗?