Search code examples
phplaraveleloquentqueryselector

How to join multiple tables using max() on Laravel


I just start learning Laravel and i got stuck on this issue. How could i do this select using QuerySelector or Eloquent on Laravel ?

That is the result i want to achieve

Thats what i came of so far:

$produtos = \DB::table('produtos AS p')
   ->leftJoin('produtos_fotos AS pf','pf.produto_id','=','p.id')
   ->leftJoin('produtos_grade AS pg','pg.produto_id','=','p.id')
     ->select('p.id','p.referencia','p.descricao','p.preco','p.ratings',
                            'p.categorias_produtos as categoria','p.promocao','p.genero', 'p.cabedal as materialCabedal','p.solado as materialSolado', 'p.altura_salto AS alturaSalto','pf.url','pf.nome_foto','min(pg.tamanho) as tam_min', 'max(pg.tamanho) as tam_max')
    ->where(['p.fornecedor_id' => $idFornecedor])
    ->groupBy('p.id')
    ->get())

But i got an error:

Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'min(pg.tamanho)' in 'field list'

Blockquote


Solution

  • Hello in laravel if you want to use raw expression in a query. you need to use DB::raw method

    in your case change to below will work.

    $produtos = \DB::table('produtos AS p')
         ->leftJoin('produtos_fotos AS pf','pf.produto_id','=','p.id')
         ->leftJoin('produtos_grade AS pg','pg.produto_id','=','p.id')
         ->select(
              'p.id',
              'p.referencia',
              'p.descricao',
              'p.preco',
              'p.ratings',
              'p.categorias_produtos as categoria',
               'p.promocao',
               'p.genero',
               'p.cabedal as materialCabedal',
               'p.solado as materialSolado',
               'p.altura_salto AS alturaSalto',
               'pf.url', 
               'pf.nome_foto',
                    DB::raw('min(pg.tamanho) as tam_min'),
                     DB::raw('max(pg.tamanho) as tam_max')
          )
          ->where(['p.fornecedor_id' => $idFornecedor])
          ->groupBy('p.id')
          ->get())