【问题标题】:Transforming Raw Sql to Laravel equolent将原始 Sql 转换为 Laravel equolent
【发布时间】:2021-09-13 10:06:30
【问题描述】:

我已经写了这段 SQL 代码

SELECT drugs.*, COUNT(*) as 'views' from drugs INNER JOIN drug_seen on drugs.id = drug_seen.drug_id GROUP BY drugs.id order by views ASC

现在我正在尝试在 Laravel equolent 中写入,但我遇到了一些麻烦。 这是我尝试过的

$drugs = Drug::select(DB::raw('drugs.*,count(*) as views'))
                    ->join('drug_seen', 'drugs.id', 'drug_seen.drug.id')
                    ->groupBy('drug.id')->orderByRaw('views');
            

我遇到了诸如未找到列之类的错误,我认为代码编写不正确

药物类

class Drug extends Model
{
    use HasFactory;
    use SoftDeletes;

...
...
...

public function drugVisits()
{
     return $this->hasMany(DrugSeen::class);
}

【问题讨论】:

  • 如果你真的想使用 Eloquent,你必须使用 Drug 模型和 Eloquent API,这段代码仍然使用低级 DB API 的太多原始查询。您能否分享您的Drug 模型课程并详细说明您的意图?仅通过 SQL 查询很难知道您想要什么。
  • @RobinDeSchepper 刚刚编辑了它
  • @Thymeleaf,你遇到了哪个错误,你能显示完整的错误吗
  • 你写的sql能用吗?因为我认为它会抛出错误
  • @workservice 是的,sql 工作得很好

标签: sql laravel eloquent


【解决方案1】:

一旦您使用 join(),您就会离开 Eloquent 并进入 Query\Builder,在此过程中失去模型配置的好处。如果您希望通过 both 表过滤结果,with() eager-loads 不是答案。你要的是whereHas()

此外,就您在那里的分组和计数操作而言,我认为您更多的是寻找集合处理而不是 SQL 组。

$drugModel = app(Drugs::class);
$results = $drugModel->whereHas('drugVisits')->with('drugVisits')->get();
$organizedResults = $results
    ->groupBy($drugModel->getKey())
    ->sortyBy(function (Drugs $drugRecord) {
        return $drugRecord->drugVisits->count();
    });

如果你想要一个'views'属性在根级元素中携带计数,它看起来像这样:

$drugModel = app(Drugs::class);
$results = $drugModel->whereHas('drugVisits')->with('drugVisits')->get();
$organizedResults = $results
    ->groupBy($drugModel->getKey())
    ->map(function (Drugs $drugRecord) {
        $drugRecord->views = $drugRecord->drugVisits->count();
        return $drugRecord;
    });
    ->sortyBy('views');

【讨论】:

    【解决方案2】:

    您在 join 中有拼写错误,而不是在您使用 drug.iddrug_id

    试试这个:

    $drugs = Drug::select(DB::raw('drugs.*,count(*) as views'))
                      ->join('drug_seen', 'drugs.id', 'drug_seen.drug_id')
                      ->groupBy('drugs.id')->orderByRaw('views');
              }
    

    【讨论】:

    • 试过了,它正在抛出 Column not found: 1054 Unknown column 'drug.id' in 'group statement'
    • 更新的答案,Bcs你没有drug.id它是drugs.id
    • 我有不同的错误,我们可以去聊天吗?
    • 它就像另一个查询,在此之前它正在执行,我认为它们相互冲突
    【解决方案3】:

    这会解决你的问题。

    $drugs = Drug::with('drugVisits')->get();
    
    $drugs->count(); //for total records in drugs table.
    

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2021-08-19
      • 2019-04-04
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2016-07-01
      • 2021-09-11
      相关资源
      最近更新 更多