Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę przekonwertować agregację warunkową mysql na zapytanie laravel?

Musisz dostarczyć aggregate funkcji w posiadaniu klauzuli, możemy ponownie użyć tej samej, którą mamy w select w ten sposób

$brand = "MAX(CASE WHEN b.attribute_code = 'brand' then b.attribute_value END)";

$model = "MAX(CASE WHEN b.attribute_code = 'model' then b.attribute_value END)";

$category = "MAX(CASE WHEN b.attribute_code = 'category' then b.attribute_value END)";

$subcategory = "MAX(CASE WHEN b.attribute_code = 'subcategory' then b.attribute_value END)";

$brandName = 'honda';

$query = Item::selectRaw("a.number, a.description, {$brand} as brand, {$model} as model, {$category} as category, {$subcategory} as subcategory")
        ->from('items as a')
        ->join('attr_maps as b','b.number','=','a.number')
        ->groupBy('a.number')
        ->havingRaw("{$brand} = ?", [$brandName])
        ->orderBy('description')
        ->paginate(10);

return $query;

EDYTUJ: Po komentarzach

Możesz wykonać dla każdego parametru w ten sposób

$query = Item::selectRaw("a.number, a.description, {$brand} as brand, {$model} as model, {$category} as category, {$subcategory} as subcategory")
    ->from('items as a')
    ->join('attr_maps as b','b.number','=','a.number')
    ->groupBy('a.number')
    ->orderBy('description');

foreach($param as $key => $value) {
     $query = $query->havingRaw("{$$key} = ?", [$value]);
}

$results = $query->paginate(10);

return $results;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 'secure-file-priv' w MySQL nie pozwala na ładowanie pliku danych, nawet z przydzielonego bezpiecznego folderu

  2. PHP/PDO wstawia bieżącą datę plus jeden miesiąc do MYSQL

  3. Trudność ze zmienną długością opóźnienia

  4. Instalowanie określonych wersji pakietów za pomocą pip

  5. Jak naprawić kod stanu serwera:302 znaleziony przez dodatek SQL Inject Me Firefox