Maison  >  Article  >  développement back-end  >  Comment convertir des requêtes MySQL complexes avec plusieurs instructions en Laravel Eloquent ?

Comment convertir des requêtes MySQL complexes avec plusieurs instructions en Laravel Eloquent ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-26 06:49:30401parcourir

How to Convert Complex MySQL Queries with Multiple Statements to Laravel Eloquent?

Conversion de requêtes MySQL complexes avec plusieurs instructions en Laravel Eloquent

Dans le monde des requêtes de bases de données, la possibilité de convertir des requêtes SQL complexes en leurs homologues Laravel Eloquent est cruciale. L'un de ces défis se pose lorsqu'il s'agit de requêtes MySQL multi-instructions, qui impliquent une série d'instructions telles que PREPARE, EXECUTE et DEALLOCATE.

Énoncé du problème

Vous avez une requête MySQL avec plusieurs instructions :

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'ifnull(SUM(case when location_code = ''',
      location_code ,
      ''' then quantity end),0) AS `',
      location_code , '`'
    )
  ) INTO @sql
FROM
  item_details;
SET @sql = CONCAT('SELECT item_number,SUM(quantity) as "total_quantity", ', @sql, ' 
                  FROM item_details
                   GROUP BY item_number');

PREPARE stmt FROM @sql;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;

Vous cherchez à convertir cette requête complexe en Laravel Eloquent, mais vous ne savez pas comment gérer les multiples instructions impliquées.

Solution

Bien que certains aspects de la requête MySQL, tels que la préparation et l'exécution de l'instruction, ne soient pas directement traduisibles en Eloquent, la fonctionnalité de base peut être atteinte. Voici une solution :

<code class="php">DB::table('item_details')
    ->selectRaw('GROUP_CONCAT(...) INTO @sql')
    ->get();

$sql = DB::selectOne('select @sql')
    ->{'@sql'};

ItemDetails::select('item_number', DB::raw('SUM(quantity) as total_quantity'))
    ->selectRaw($sql)
    ->groupBy('item_number')
    ->get();</code>

Explication

Cette solution est un mélange de requêtes SQL éloquentes et brutes.

  • DB : table('item_details')->selectRaw('GROUP_CONCAT(...) INTO @sql')->get(); exécute la première instruction, qui crée une variable SQL temporaire nommée @sql.
  • $sql = DB::selectOne('select @sql')->{'@sql'}; récupère la valeur de la variable @sql et la stocke dans la variable $sql.
  • ItemDetails::select('item_number', DB::raw('SUM(quantity) as total_quantity'))-> selectRaw($sql)->groupBy('item_number')->get(); construit la requête Eloquent principale. Il utilise selectRaw($sql) pour insérer la chaîne SQL dynamique obtenue à partir de $sql.

Cette approche vous permet d'effectuer la requête MySQL complexe dans le contexte de Laravel Eloquent, en simplifiant votre code et en maintenant la maintenabilité. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn