【问题标题】:Laravel select from derived tableLaravel 从派生表中选择
【发布时间】:2014-03-10 22:20:28
【问题描述】:

有没有办法把这个查询翻译成 Laravel eloquent 格式?

SELECT TEMP.A, COUNT(*) AS Total FROM 
      (SELECT A FROM TABLE WHERE B='something' GROUP BY C) 
AS TEMP GROUP BY TEMP.A

我在这里要做的是根据 C 的不同记录获取 A 的计数,该记录属于某些 where 子句。

subselect 语句也是一个雄辩的对象,它是由用户在过滤器上输入构建的,以获取 C 的不同记录。 我试图这样做,假设子选择雄辩的对象是 $query

$query2->DB::connection()->table(function($_query) use ($query){
  $_query = $query;
  $_query->addSelect('A')->where('B','=','something')->groupBy('C')->get();
})->addSelect('A')->addSelect(DB::raw('COUNT(*) as Total'))->groupBy('A')->get(); 

但它似乎不起作用,有人建议在 ->table() 中使用 DB::raw,但问题是 subselect 语句实际上也是一个动态构建的 eloquent 语句。

非常感谢您提前提供的帮助

【问题讨论】:

  • 除非您绝对需要与数据库无关,否则无需强制执行更复杂的 SQL 查询的“雄辩方式”。如果不需要,不要过度复杂化你的代码。使用绑定运行普通的原始查询,或者根据需要混合和匹配一些 Eloquent 和一些原始查询。

标签: laravel eloquent


【解决方案1】:

子查询不能很好地与 Eloquent 配合使用。你只是让自己头疼不敢尝试。我建议使用 DB:select(),然后将 hydrate() 添加到您的模型中,并使用它将其转换为 Eloquent。这就是我处理复杂查询的方式:

包含查询的文件:

<?php
    $query = "SELECT TEMP.A, COUNT(*) AS Total FROM (SELECT A FROM TABLE WHERE B='?' GROUP BY C) AS TEMP GROUP BY TEMP.A";
    $thing_query = DB::select($query, ['something']);
    $thing = Thing::hydrate($thing_query);
    // hydrate converted it into Eloquent so we can use things like first()
    return $thing->first()->total;

模型/Thing.php

<?php
class Thing extends Eloquent {
    /**
     * Hydrate method
     * 
     * @param array $data
     * @return Illuminate\Database\Eloquent\Collection
     */
    static public function hydrate(array $data, $connection = NULL)
    {
        // get calling class so we can hydrate using that type
        $klass = get_called_class();

        // psuedo hydrate
        $collection = new Illuminate\Database\Eloquent\Collection();
        foreach ($data as $raw_obj)
        {
            $model = new $klass;
            $model = $model->newFromBuilder($raw_obj);
            if (!is_null($connection))
                $model = $model->setConnection($connection);
            $collection->add($model);
        }
        return $collection;

    }
}

【讨论】:

    猜你喜欢
    • 2013-01-14
    • 2014-01-24
    • 2015-01-12
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多