【问题标题】:Getting average value in JOIN query, Works in raw MySql but does not work in Laravel query builder在 JOIN 查询中获取平均值,在原始 MySql 中有效,但在 Laravel 查询生成器中无效
【发布时间】:2016-12-12 11:15:54
【问题描述】:

我在 Laravel 查询生成器中写出了这个查询,但是当我运行它时,它返回这个错误:Call to a member function join() on float

$avgYield= DairyCropYield::avg('moisture')
            ->join('dairy_crops','dairy_crops.id','=','dairy_crop_yields.dairy_crop_id')
            ->join('dairy_crop_varieties','dairy_crops.dairy_crop_variety_id','=','dairy_crop_varieties.id')
            ->where('dairy_crop_varieties.crop','=',$crop->crop)
            ->whereYear('harvested_at','=',Carbon::now()->year)
            ->get();

但是当我在 mySql 中编写相同的查询时,它会像预期的那样工作:

SELECT AVG(moisture) FROM dairy_crop_yields AS yield JOIN dairy_crops AS crop ON crop.id = yield.dairy_crop_id JOIN dairy_crop_varieties AS variety ON variety.id = crop.dairy_crop_variety_id WHERE variety.crop = 'corn' AND YEAR(harvested_at) = 2015

关于我在 Laravel 查询构建器中做得不对的任何想法/建议。 我确实想掌握并坚持使用 Laravel 的查询构建器。 谢谢。

【问题讨论】:

  • 尝试将其转换为->toSql(),使其查询字符串

标签: php mysql laravel eloquent


【解决方案1】:

avg 放在get() 之后,avg 方法适用于集合。所以你想要的是先get()所有结果然后只在可用结果上调用avg('moisture')

$avgYield= DairyCropYield::join('dairy_crops','dairy_crops.id','=','dairy_crop_yields.dairy_crop_id')
        ->join('dairy_crop_varieties','dairy_crops.dairy_crop_variety_id','=','dairy_crop_varieties.id')
        ->where('dairy_crop_varieties.crop','=',$crop->crop)
        ->whereYear('harvested_at','=',Carbon::now()->year)
        ->get()
        ->avg('moisture');

或者,您也可以使用DB::raw 执行类似的操作

$avgYield= DairyCropYield::select(DB::raw('AVG(moisture)'))
    ->join('dairy_crops','dairy_crops.id','=','dairy_crop_yields.dairy_crop_id')
    ->join('dairy_crop_varieties','dairy_crops.dairy_crop_variety_id','=','dairy_crop_varieties.id')
    ->where('dairy_crop_varieties.crop','=',$crop->crop)
    ->whereYear('harvested_at','=',Carbon::now()->year)
    ->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 2013-05-20
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多