Génération des models depuis la base de données avec les devtools
Note
Dans cette partie, votre projet est déjà créé.
Si vous n’avez pas de base de données mysql sous la main, vous pouvez télécharger celle-ci : messagerie.sql
Configuration
Vérifiez la configuration de la base de données avec les devtools en mode console :
Ubiquity config database
Note
Le fichier de configuration est situé dans app/config/config.php.
Changez la configuration de la base de données pour utiliser la base de données messagerie :
Ubiquity config:set --database.dbName=messagerie
Génération
Pour générer tous les modèles, utilisez la commande all-models :
Ubiquity all-models
C’est tout !
Les modèles sont générés et opérationnels.
Note
Il est possible de générer des modèles automatiquement lors de la création d’un projet avec l’option -m
pour les modèles et ``-b`”” pour spécifier la base de données :
Ubiquity new quick-start -a -m -b=messagerie
Vérifications
Meta-datas des models
Pour obtenir les métadonnées de tous les modèles créés :
Ubiquity info:models
Pour un modèle particulier :
Ubiquity info:models -m=Groupe
Informations relatives à la validation
Pour obtenir les règles de validation pour le modèle User :
Ubiquity info:validation -m=User
Sur un membre particulier (email) :
Ubiquity info:validation -m=User -f=email
Classes générées
Les classes générées sont situées dans le dossier app/models, si la configuration de mvcNS.models n’a pas été modifiée.
Note
Si vous voulez en savoir plus à ce sujet :
La classe User :
1namespace models;
2
3use Ubiquity\attributes\items\Id;
4use Ubiquity\attributes\items\Column;
5use Ubiquity\attributes\items\Validator;
6use Ubiquity\attributes\items\ManyToOne;
7use Ubiquity\attributes\items\JoinColumn;
8use Ubiquity\attributes\items\OneToMany;
9use Ubiquity\attributes\items\ManyToMany;
10use Ubiquity\attributes\items\JoinTable;
11
12class User{
13
14 #[Id]
15 #[Column(name: 'id', nullable: false, dbType: 'int(11)')]
16 #[Validator('id', constraints: ['autoinc'=>true])]
17 private $id;
18
19 #[Column(name: 'firstname, nullable: false, dbType: 'varchar(65)')]
20 #[Validator('length', constraints: ['max'=>65, 'notNull'=>true])]
21 private $firstname;
22
23 #[Column(name: 'lastname, nullable: false, dbType: 'varchar(65)')]
24 #[Validator('length', constraints: ['max'=>65, 'notNull'=>true])]
25 private $lastname;
26
27 #[Column(name: 'email', nullable: false, dbType: 'varchar(255)')]
28 #[Validator('email', constraints: ['notNull'=>true])]
29 #[Validator('length', constraints: ['max'=>255])]
30 private $email;
31
32 #[Column(name: 'password', nullable: true, dbType: 'varchar(255)')]
33 #[Validator('length', constraints: ['max'=>255])]
34 private $password;
35
36 #[Column(name: 'suspended', nullable: true, dbType: 'tinyint(1)')]
37 #[Validator('isBool')]
38 private $suspended;
39
40 #[ManyToOne]
41 #[JoinColumn(className: 'models\\Organization', name: 'idOrganization', nullable: false)]
42 private $organization;
43
44 #[OneToMany(mappedBy: 'user', className: "models\\Connection")]
45 private $connections;
46
47 #[ManyToMany(targetEntity: 'models\\Groupe', inversedBy: 'users')]
48 #[JoinTable(name: 'groupeusers')]
49 private $groupes;
50}
1namespace models;
2
3class User{
4 /**
5 * @id
6 * @column("name"=>"id","nullable"=>false,"dbType"=>"int(11)")
7 * @validator("id","constraints"=>array("autoinc"=>true))
8 */
9 private $id;
10
11 /**
12 * @column("name"=>"firstname","nullable"=>false,"dbType"=>"varchar(65)")
13 * @validator("length","constraints"=>array("max"=>65,"notNull"=>true))
14 */
15 private $firstname;
16
17 /**
18 * @column("name"=>"lastname","nullable"=>false,"dbType"=>"varchar(65)")
19 * @validator("length","constraints"=>array("max"=>65,"notNull"=>true))
20 */
21 private $lastname;
22
23 /**
24 * @column("name"=>"email","nullable"=>false,"dbType"=>"varchar(255)")
25 * @validator("email","constraints"=>array("notNull"=>true))
26 * @validator("length","constraints"=>array("max"=>255))
27 */
28 private $email;
29
30 /**
31 * @column("name"=>"password","nullable"=>true,"dbType"=>"varchar(255)")
32 * @validator("length","constraints"=>array("max"=>255))
33 */
34 private $password;
35
36 /**
37 * @column("name"=>"suspended","nullable"=>true,"dbType"=>"tinyint(1)")
38 * @validator("isBool")
39 */
40 private $suspended;
41
42 /**
43 * @manyToOne
44 * @joinColumn("className"=>"models\\Organization","name"=>"idOrganization","nullable"=>false)
45 */
46 private $organization;
47
48 /**
49 * @oneToMany("mappedBy"=>"user","className"=>"models\\Connection")
50 */
51 private $connections;
52
53 /**
54 * @manyToMany("targetEntity"=>"models\\Groupe","inversedBy"=>"users")
55 * @joinTable("name"=>"groupeusers")
56 */
57 private $groupes;
58}
Important
Toute modification sur les classes (code ou annotations) nécessite la réinitialisation du cache.
Ubiquity init-cache -t=models
Interrogations
Les classes sont générées, et le cache des models également.
A ce stade, nous pouvons interroger la base de données en mode console, pour avoir une idée des possibilité de la partie DAO:
Interrogations classiques
Obtenir tous les groupes :
Ubiquity dao getAll -r=Groupe
Avec leur organisation :
Ubiquity dao getAll -r=Groupe -i=organization
Une requête plus complète :
Rechercher les groupes ayant le mot « list « dans leur email, en affichant le nom, l’email et l’organisation de chaque groupe :
Ubiquity dao getAll -r=Groupe -c="email like '%liste%'" -f=email,name,organization -i=organization
Obtenir un User à partir de son id :
Ubiquity dao getOne -r=User -c="id=4"
uQueries
Les UQueries sont particulières car elles permettent de définir des critères sur les valeurs des membres des objets associés :
Rechercher les groupes avec un utilisateur de nom Shermans.
Ubiquity dao uGetAll -r=Groupe -c="users.lastname='Shermans'" -i=users
Nous pouvons vérifier que Shermans appartient au groupe Auditeurs.
Ubiquity dao uGetAll -r=User -c="groupes.name='Auditeurs' and lastname='Shermans'" -i=groupes
La même chose avec une requête paramétrée :
Ubiquity dao uGetAll -r=User -c="groupes.name= ? and lastname= ?" -i=groupes -p=Auditeurs,Shermans