Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Ven Aoû 11, 2017 12:04

Bonjour

Mon problème ( pour cet ORM que je compte faire ) :

Spécifier les dépendances entre ces classes : TABLE, SELECT, WHERE, GET.

TABLE('Table')->SELECT('Column')->WHERE('Column2', '=', $value)->GET();

J'ai cet injecteur de dépendances ( brut de brut ) :


Code: Tout sélectionner

<?php

class Container {
 protected $s=array();
 function __set($k, $c) { $this->s[$k]=$c; }
 function __get($k) { return $this->s[$k]($this); }
}

?>



Comment ( avec cet injecteur ou un autre ), représenter en code PHP, la dépendance chaînée ci-dessus ?

Je sais un peu programmer en POO, mais pas terrible. ;)

Merci beaucoup.
Haut
9 Réponses
Messages: 8608

Enregistré le: 14 Mai 2003

Message le Ven Aoû 11, 2017 16:40

Pour chainer les méthodes, à la fin de chaque méthode il faut:
Code: Tout sélectionner
return $this


NB: pourquoi réinventer encore et toujours la roue ? Eloquent de Laravel ça rox.
Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Ven Aoû 11, 2017 16:56

Bonjour spout

Super merci, je n'avais pas pensé à çà.

Sinon, pour le traitement PHP ( traduction syntaxe ORM => syntaxe MySQL et optimisation ), çà peut être fait avec des arrays. ;)

Mais... Quand on exécute une instruction PHP telle que :

Code: Tout sélectionner
  $result = DB::TABLE('Table')->SELECT('Column')->WHERE('Id','=', $value)->GET();


Celà revient à lancer la fonction TABLE, puis SELECT, puis WHERE etc... ou le contraire ?

Logiquement, l'interpréteur ( ou compilateur just in time ), procède de gauche à droite par défaut ?

Je suppose que c'est une question stupide, mais j'ai peur de commettre des boulettes...

Merci beaucoup pour ta réponse.

Respectueusement.
Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Ven Aoû 11, 2017 17:03

Pardon

Pour ce qui est de réinventer la roue, je reconnais que tu n'as pas tort. ;)

Ce que je veux, c'est optimiser au max, les perfs et autres choses.


Et puis c'est un challenge, quasiment une idée fixe pour moi. ;)

Respects.
Haut
Messages: 8608

Enregistré le: 14 Mai 2003

Message le Ven Aoû 11, 2017 17:34

ortolojf a écrit:Celà revient à lancer la fonction TABLE, puis SELECT, puis WHERE etc... ou le contraire ?

TABLE puis SELECT puis WHERE
Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Ven Aoû 11, 2017 18:11

Merci beaucoup spout

Super sympa, je vais me mettre à la prog.

J'ai déjà ( tu sais ), une classe Database qui me génère ( à peu près ), la syntaxe ORM à partir de MySQL ( le contraire ).

Je vais voir celà ce week-end. ;)

Super merci encore.

Respectueusement.
Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Sam Aoû 12, 2017 17:54

Bonjour

Je fais pour l'instant, le remplissage de mes arrays, avec affichage des paramètres un peu dégrossis.

Celà est fait avec une seule instruction PHP, de syntaxe classique Eloquent, et affichage ci-dessous mode Eloquent avec paramètres plus compatibles SQL classique.

Voici ce que celà donne pour l'instant :

Code: Tout sélectionner


<?php
/*
 * PHP lancé :
 */

$connexion = new Database("");

$connexion->TABLE('MyTable')
        ->INSERT(['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'])
        ->REPLACE(['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'])
        ->WHERE('MyColumn1', '<>', 'MyValue1_1')
        ->OR_WHERE('MyColumn2', '<>', 'MyValue1_2')
        ->WHERE_NULL('MyColumn1')
        ->WHERE_NOT_NULL('MyColumn2')
        ->WHERE_BETWEEN('MyColumn1', [0, 1])
        ->WHERE_NOT_BETWEEN('MyColumn2', [1, 6])
        ->WHERE_IN('MyColumn1', [0, 1, 2, 3, 4])
        ->WHERE_NOT_IN('MyColumn2', [1, 6, 7, 8, 9])
        ->WHERE_DATE('MyColumn1', 'MyValue1_1')
        ->WHERE_MONTH('MyColumn1', '=', 'MyValue1_1')
        ->WHERE_DAY('MyColumn1', 'MyValue1_1')
        ->WHERE_YEAR('MyColumn1', '>', 'MyValue1_1')
        ->UPDATE(['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'])
        ->UPDATE([
                ['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'],
                ['MyColumn1' => 'MyValue2_1', 'MyColumn2' => 'MyValue2_2']
                ])
        ->INSERT(['MyColumn1' => 'MyValue1_1']);
?>

/*
 * Résultat affiché :
 */ 
        TABLE('MyTable')
        ->INSERT ('MyColumn1', 'MyColumn2') VALUES(`MyValue1_1`, `MyValue1_2`)
        ->REPLACE ('MyColumn1', 'MyColumn2') VALUES(`MyValue1_1`, `MyValue1_2`)
        ->WHERE `MyColumn1`<>`MyValue1_1`
        ->OR WHERE `MyColumn2`<>`MyValue1_2`
        ->WHERE 'MyColumn1' IS NULL
        ->WHERE 'MyColumn2' IS NOT NULL
        ->WHERE 'MyColumn1' BETWEEN 0 AND 1
        ->WHERE 'MyColumn2' NOT BETWEEN 1 AND 6
        ->WHERE 'MyColumn1' IN (1, 2, 3, 4)
        ->WHERE 'MyColumn2' NOT IN (1, 6, 7, 8, 9)
        ->WHERE `MyColumn1`=DATE('MyValue1_1')
        ->WHERE `MyColumn1`=MONTH('MyValue1_1')
        ->WHERE `MyColumn1`=DAY('MyValue1_1')
        ->WHERE `MyColumn1`>YEAR('MyValue1_1')
        ->UPDATE SET 'MyColumn1'=`MyValue1_1`, 'MyColumn2'=`MyValue1_2`
        ->UPDATE SET 'MyColumn1'=`MyValue1_1`, 'MyColumn2'=`MyValue1_2`
        ->UPDATE SET 'MyColumn1'=`MyValue2_1`, 'MyColumn2'=`MyValue2_2`
        ->INSERT ('MyColumn1') VALUES(`MyValue1_1`);



La syntaxe de REPLACE est probablement fausse, je modifierai après.

Comme j'ai toutes ces données partielles dans mes variables indicées, ce sera très facile de générer dans tous les cas, le SQL à exécuter.

Je vais voir pour les autres type d'instructions MySQL.

Respectueusement.
Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Dim Aoû 13, 2017 11:49

Voili, voilou

Je groupe maintenant avec des AND, les différentes lignes d'une même instruction.

Voilà ce que celà donne :


Code: Tout sélectionner


/*
 * PHP Lancé :
 */

$connexion->TABLE('MyTable')
        ->INSERT(['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'])
        ->REPLACE(['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'])
        ->WHERE('MyColumn1', '<>', 'MyValue1_1')
        ->WHERE(
                ['MyColumn1', '<>', 'MyValue1_1'],
                ['MyColumn2', '<>', 'MyValue2_1'],
                ['MyColumn3', '<>', 'MyValue3_1']
        )
        ->WHERE(
                ['MyColumn1', '<>', 'MyValue1_1']
        )
        ->WHERE_COLUMN('MyColumn1', '<>', 'MyValue1_1')
        ->WHERE_COLUMN(
                ['MyColumn1', '<>', 'MyValue1_1'],
                ['MyColumn2', '<>', 'MyValue2_1'],
                ['MyColumn3', '<>', 'MyValue3_1']
        )
        ->OR_WHERE(['MyColumn2', '<>', 'MyValue1_2'])
        ->WHERE_NULL(
                ['MyColumn1',
                'MyColumn2',
                'MyColumn3']
        )
        ->WHERE_BETWEEN(
                ['MyColumn1', [0, 1]],
                ['MyColumn2', [5, 7]]
        )
        ->WHERE_NOT_BETWEEN(
                ['MyColumn4', [1, 6]],
                ['MyColumn5', [4, 8]]
        )
        ->WHERE_IN(
                ['MyColumn1', [0, 1, 2, 3, 4]],
                ['MyColumn2', [2, 3, 4, 5, 6]]
        )
        ->WHERE_NOT_IN(
                ['MyColumn1', [4, 5, 6, 7, 8]],
                ['MyColumn2', [2, 3, 4]]
        )
        ->WHERE_DATE(
                ['MyColumn1', 'MyValue1_1'],
                ['MyColumn2', 'MyValue1_2']
        )
        ->WHERE_MONTH(
                ['MyColumn1', 'MyValue1_1'],
                ['MyColumn2', 'MyValue1_2']
        )
        ->WHERE_DAY(
                ['MyColumn1', 'MyValue1_1'],
                ['MyColumn2', 'MyValue1_2']
        )
        ->WHERE_YEAR(
                ['MyColumn1', 'MyValue1_1'],
                ['MyColumn2', 'MyValue1_2']
        )
        ->UPDATE(
                ['MyColumn1' => 'MyValue1_1', 'MyColumn2' => 'MyValue1_2'],
                ['MyColumn1' => 'MyValue2_1', 'MyColumn2' => 'MyValue2_2']
                )
        ->INSERT(['MyColumn1' => 'MyValue1_1']);


/*
 * Affichage :
 */


    TABLE('MyTable')
        ->INSERT ('MyColumn1', 'MyColumn2') VALUES(`MyValue1_1`, `MyValue1_2`)
        ->REPLACE ('MyColumn1', 'MyColumn2') VALUES(`MyValue1_1`, `MyValue1_2`)
        ->WHERE `MyColumn1`<>`MyValue1_1`
        ->WHERE `MyColumn1`<>`MyValue1_1` AND `MyColumn2`<>`MyValue2_1` AND `MyColumn3`<>`MyValue3_1`
        ->WHERE `MyColumn1`<>`MyValue1_1`
        ->WHERE_COLUMN 'MyColumn1'<>'MyValue1_1'
        ->WHERE_COLUMN 'MyColumn1'<>'MyValue1_1' AND 'MyColumn2'<>'MyValue2_1' AND 'MyColumn3'<>'MyValue3_1'
        ->OR WHERE `MyColumn2`<>`MyValue1_2`
        ->WHERE `MyColumn1` IS NULL AND `MyColumn2` IS NULL AND `MyColumn3` IS NULL
        
->WHERE `MyColumn1` BETWEEN 0 AND 1 AND `MyColumn2` BETWEEN 5 AND 7
        
->WHERE `MyColumn4` NOT BETWEEN 1 AND 6 AND `MyColumn5` NOT BETWEEN 4 AND 8
        
->WHERE `MyColumn1` IN (0, 1, 2, 3, 4) AND `MyColumn2` IN (2, 3, 4, 5, 6)
        ->WHERE `MyColumn1` NOT IN (4, 5, 6, 7, 8) AND `MyColumn2` NOT IN (2, 3, 4)
        ->WHERE 'MyColumn1'=DATE('MyValue1_1') AND 'MyColumn2'=DATE('MyValue1_2')
        ->WHERE 'MyColumn1'=MONTH('MyValue1_1') AND 'MyColumn2'=MONTH('MyValue1_2')
        ->WHERE 'MyColumn1'=DAY('MyValue1_1') AND 'MyColumn2'=DAY('MyValue1_2')
        ->WHERE 'MyColumn1'=YEAR('MyValue1_1') AND 'MyColumn2'=YEAR('MyValue1_2')
        ->UPDATE SET 'MyColumn1'=`MyValue1_1`, 'MyColumn2'=`MyValue1_2`
        ->UPDATE SET 'MyColumn1'=`MyValue2_1`, 'MyColumn2'=`MyValue2_2`
        ->INSERT ('MyColumn1') VALUES(`MyValue1_1`)


 



Bien à vous.

Amicalement.
Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Mar Aoû 15, 2017 19:12

Rebonjour

Voilà j'ai tout sauf les RAW() et les mises en mémoire RAM des données lues.

Voici ce que celà donne :

La syntaxe Eloquent est celle de l'instruction PHP déclenchée.

La syntaxe Eloquent interprétée, n'est pas importante, les composantes de l'instruction MySQL résultante, sont mémorisées dans des arrays .

La syntaxe MySQL ( en bas ), est l'instruction MySQL, traduction de la syntaxe Eloquent.

Pour terminer, outre les RAW() ( théoriquement faciles ), je n'ai plus que les détails ( IGNORE, DELAYED, etc... ), et les fonctions de lecture : GET(), FIRST(), PLUCK(), VALUE(), etc...

J'ai déjà fait la fonction CHUNK() avec sa fonction anonyme de pagination.

Merci de me donner vos impressions.



Code: Tout sélectionner
/*
 *      Syntaxe Eloquent :
 *      ****************
 */

   $connexion->TABLE('MyTable')
      ->SELECT([
         ['MyColumn1', 'MyColumn2'],
         ['MyColumn3', 'MyColumn4']
      ])
      ->WHERE_BETWEEN(
         ['MyColumn1', [0, 1]],
         ['MyColumn2', [5, 7]]
      )
      ->WHERE_NOT_BETWEEN(
         ['MyColumn4', [1, 6]],
         ['MyColumn5', [4, 8]]
      )
      ->LOCK_FOR_UPDATE()
      ->GET()

/*
 *      Syntaxe Eloquent interprétée :
 *      ****************************
 */

      TABLE(MyTable)
      ->SELECT `MyColumn1`, `MyColumn2`
      ->SELECT `MyColumn3`, `MyColumn4`
      ->WHERE `MyColumn1` BETWEEN 0 AND 1 AND `MyColumn2` BETWEEN 5 AND 7
      ->WHERE `MyColumn4` NOT BETWEEN 1 AND 6 AND `MyColumn5` NOT BETWEEN 4 AND 8
      ->LOCK_FOR_UPDATE()

/*
 *      Syntaxe MySQL :
 *      *************
 */
      SELECT `MyColumn1`, `MyColumn2` FROM MyTable WHERE `MyColumn1` BETWEEN 0 AND 1 AND `MyColumn2` BETWEEN 5 AND 7 AND `MyColumn4` NOT BETWEEN 1 AND 6 AND `MyColumn5` NOT BETWEEN 4 AND 8 FOR UPDATE

      SELECT `MyColumn3`, `MyColumn4` FROM MyTable WHERE `MyColumn1` BETWEEN 0 AND 1 AND `MyColumn2` BETWEEN 5 AND 7 AND `MyColumn4` NOT BETWEEN 1 AND 6 AND `MyColumn5` NOT BETWEEN 4 AND 8 FOR UPDATE

Haut
Messages: 2740

Enregistré le: 14 Aoû 2002

Message le Jeu Aoû 17, 2017 10:26

Rebonjour

Voilà, j'ai fait tout sauf les sous-requêtes autres que DB::chunk().

J'aurais besoin de savoir, quels sont tous les cas de Closures ( fonctions anonymes paramètres d'une fonction Eloquent ), autres que la Closure de DB::chunk().

Par exemple je sais qu'il y a :
Code: Tout sélectionner
 DB::OrWhere(function($query) {})


Mais y a-t-il aussi :
Code: Tout sélectionner
 DB::Where(function($query) {} ) 
?

Et les autres Where avec des sous-requêtes ?

Par exemple les WhereIn ?

Merci beaucoup.

Respectueusement.
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.