【问题标题】:Transform an SQL statement to Eloquent query builder将 SQL 语句转换为 Eloquent 查询构建器
【发布时间】:2021-10-02 06:17:44
【问题描述】:

我有一个 SQL 查询,我发现很难将其转换为 Laravel Eloquent 查询。我用工作台试了一下,效果很好。

SELECT fi.id,fi.internal_name,fi.nombre_contacto,fi.apellidos_contacto,fi.category,
COALESCE(SUM(fi.totalClicks), 0) AS totalclicks FROM(

   SELECT af.id,af.internal_name,af.nombre_contacto,
            af.apellidos_contacto,af.category,SUM(afc.clicks) AS totalClicks
   FROM afiliados_referral_clicks afc, afiliados af WHERE  afc.idAfiliado = af.id
    and fecha >= DATE('2021-07-01') AND fecha<= DATE('2021-07-31')
   GROUP BY af.id 
UNION
SELECT af.id,af.internal_name,af.nombre_contacto,
        af.apellidos_contacto,af.category, 0 AS totalClicks 
FROM afiliados af   ) as fi
GROUP BY fi.id
LIMIT 7000
;

我尝试了什么?我可以看到查询中有 3 个 SELECT,外部一个(父级)。

SELECT fi.id,fi.internal_name,fi.nombre_contacto,fi.apellidos_contacto,fi.category,COALESCE(SUM(fi.totalClicks), 0) AS totalclicks 
FROM(somewhere as fi)

还有两个内部的(child1)。

SELECT af.id,af.internal_name,af.nombre_contacto,
            af.apellidos_contacto,af.category,SUM(afc.clicks) AS totalClicks
 FROM afiliados_referral_clicks afc, afiliados af WHERE  afc.idAfiliado = af.id
    and fecha >= DATE('2021-07-01') AND fecha<= DATE('2021-07-31')
 GROUP BY af.id 
UNION
something

child2

something
UNION
SELECT af.id,af.internal_name,af.nombre_contacto,
        af.apellidos_contacto,af.category,0 AS totalClicks  

我的方法是进行 3 个单独的查询并将它们合并。

child1

$child1 = $db->table($db::raw('afiliados, afiliados_referral_clicks'))
            ->whereColumn('afiliados.id','=','afiliados_referral_clicks.idAfiliado')
            ->addSelect(['afiliados.id','internal_name','nombre_contacto','apellidos_contacto'])
            ->selectRaw("COALESCE(SUM(clicks), 0) AS totalClicks")
            ->whereBetween('afiliados_referral_clicks.fecha',[$params['fechaReservaFrom'],$params['fechaReservaTo']])
            ->groupBy('afiliados.id')
            ; 

child2

$child2 = $db->table('afiliados')
            ->addSelect(['id','internal_name','nombre_contacto','apellidos_contacto'])
            ->selectRaw("0 AS totalClicks")
            ;

父母会联合两个孩子。

$parent = $child1->union($child2)
        ->addSelect(['afiliados.id','afiliados.internal_name','afiliados.nombre_contacto','afiliados.apellidos_contacto'])
        ->selectRaw("COALESCE(SUM(totalClicks), 0) AS totalClicks")
        ->get()
        ;

但在执行代码时出现此错误。

400 (SQLSTATE[42S22]: 未找到列: 1054 未知列 “字段列表”中的“总点击次数”

我认为我在正确的轨道上,如果我返回 $child1->get() 或 $child2->get() 我得到的集合就好了,我相信问题在于 $parent 因为我不知道如何访问我在 $child2 中添加的 totalClicks 列。

当然,那是我尝试过的,我仍然可能有一些可怕的错误,希望你们能帮助我。

【问题讨论】:

  • 你试过什么?您在尝试中遇到过错误/困难吗?

标签: mysql sql laravel eloquent


【解决方案1】:

您采用正确的方法将查询分成 3 个不同的查询。 这应该与您发布的查询相同。

$union = DB::query()
  ->select(
    'af.id',
    'af.internal_name',
    'af.nombre_contacto',
    'af.apellidos_contacto',
    'af.category'
  )
  ->selectRaw('0 as totalClicks')
  ->from('afiliados', 'af');

$sub = DB::query()
  ->select(
    'af.id',
    'af.internal_name',
    'af.nombre_contacto',
    'af.apellidos_contacto',
    'af.category'
  )
  ->selectRaw('sum(afc.clicks) as totalClicks')
  ->from(DB::raw('afiliados_referral_clicks afc, afiliados af'))
  ->whereColumn('afc.idAfiliado', 'af.id')
  ->where('fecha', '>=', DB::raw('date(\'2021-07-01\')'))
  ->where('fecha', '<=', DB::raw('date(\'2021-07-31\')'))
  ->groupBy('af.id')
  ->union($union);

$query = DB::query()
  ->select(
    'fi.id',
    'fi.internal_name',
    'fi.nombre_contacto',
    'fi.apellidos_contacto',
    'fi.category'
  )
  ->selectRaw('coalesce(sum(fi.totalClicks), 0) as totalclicks')
  ->from($sub, 'fi')
  ->groupBy('fi.id')
  ->limit(7000);

dd($query->toSql());

$results = $query->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多