XIV. Chapitre 14 : Les bases de données 2/3▲
Nous avons vu précédemment comment modifier la structure d'une base. Nous allons voir maintenant comment gérer les enregistrements.
XIV-A. Des tables d'exemple▲
Pour expérimenter la gestion des enregistrements nous allons avoir besoin de tables. Nous allons utiliser ce que nous avons vu la dernière fois pour créer deux tables. Créons une migration pour une table auteurs et une table livres :
Le code pour la migration de la table des auteurs app/database/migrations/2013_01_24_195027_create_auteurs.php (évidemment vous aurez des références différentes):
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class CreateAuteurs extends
Migration {
public
function
up()
{
Schema::
create('auteurs'
,
function
($table
) {
$table
->
increments('id'
);
$table
->
string('nom'
,
50
);
$table
->
string('prenom'
,
50
);
$table
->
date('naissance'
);
}
);
}
public
function
down()
{
Schema::
drop('auteurs'
);
}
}
Le code pour la migration de la table des livres app/database/migrations/2013_01_24_195231_create_livres.php (évidemment vous aurez là aussi des références différentes):
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class CreateLivres extends
Migration {
public
function
up()
{
Schema::
create('livres'
,
function
($table
) {
$table
->
increments('id'
);
$table
->
string('titre'
,
50
);
$table
->
integer('id_auteur'
);
}
);
}
public
function
down()
{
Schema::
drop('livres'
);
}
}
Et enfin nous faisons la migration :
XIV-A-1. Insertion de données▲
Nos tables sont un peu vides, nous allons maintenant les remplir. Créons des auteurs. Pour insérer un seul enregistrement, la syntaxe est la suivante :
DB::
table('
auteurs
'
)->
insert(
array('
nom
'
=>
'
Flaubert
'
,
'
prenom
'
=>
'
Gustave
'
,
'
naissance
'
=>
'
1821-12-12
'
)
);
Pour en insérer plusieurs, il faut faire un tableau global (là j'ai dû un peu fouiller dans le code parce que l'exemple de la documentation est incorrect, ça fait partie des plaisirs des frameworks en version bêta ) :
2.
3.
4.
5.
6.
7.
8.
9.
10.
DB::
table('
auteurs
'
)->
insert(
array(
array('
nom
'
=>
'
Raspail
'
,
'
prenom
'
=>
'
Jean
'
,
'
naissance
'
=>
'
1929-01-24
'
),
array('
nom
'
=>
'
Avril
'
,
'
prenom
'
=>
'
Nicole
'
,
'
naissance
'
=>
'
1939-08-15
'
),
array('
nom
'
=>
'
Pinger
'
,
'
prenom
'
=>
'
Robert
'
,
'
naissance
'
=>
'
1919-07-19
'
),
array('
nom
'
=>
'
Sibran
'
,
'
prenom
'
=>
'
Anne
'
,
'
naissance
'
=>
'
1963-02-04
'
),
array('
nom
'
=>
'
Saulers
'
,
'
prenom
'
=>
'
Pilippe
'
,
'
naissance
'
=>
'
1969-06-12
'
),
array('
nom
'
=>
'
July
'
,
'
prenom
'
=>
'
Serge
'
,
'
naissance
'
=>
'
1942-12-27
'
)
)
);
Pour tester ce code vous pouvez le faire directement dans une route. Ce n'est pas très joli mais parfait pour un test. Normalement ça devrait fonctionner :
Notez que la méthode insert renvoie true si l'insertion s'est bien effectuée.
On va aussi entrer quelques livres :
2.
3.
4.
5.
6.
7.
8.
9.
10.
DB::
table('
livres
'
)->
insert(
array(
array('
titre
'
=>
'
Secouons le cocotier
'
,
'
id_auteur
'
=>
'
2
'
),
array('
titre
'
=>
'
Pêcheurs de Lune
'
,
'
id_auteur
'
=>
'
2
'
),
array('
titre
'
=>
'
Les Royaumes de Borée
'
,
'
id_auteur
'
=>
'
2
'
),
array('
titre
'
=>
'
Le Quartier évanoui
'
,
'
id_auteur
'
=>
'
5
'
),
array('
titre
'
=>
'
Hugo et les Lapins
'
,
'
id_auteur
'
=>
'
5
'
),
array('
titre
'
=>
'
Le Salon des artistes
'
,
'
id_auteur
'
=>
'
7
'
)
)
);
XIV-A-2. Sélectionner des données▲
Maintenant que nous avons des données nous allons voir comment en sélectionner certaines. Commençons par quelque chose de simple en sélectionnant tous les enregistrements d'une table :
On obtient un tableau avec toutes les données sous forme d'objets :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
array (size=
7
)
0
=>
object(stdClass)[
118
]
public '
id
'
=>
int 1
public '
nom
'
=>
string '
Flaubert
'
(length=
8
)
public '
prenom
'
=>
string '
Gustave
'
(length=
7
)
public '
naissance
'
=>
string '
1821-12-12
'
(length=
10
)
1
=>
object(stdClass)[
119
]
public '
id
'
=>
int 2
public '
nom
'
=>
string '
Raspail
'
(length=
7
)
public '
prenom
'
=>
string '
Jean
'
(length=
4
)
public '
naissance
'
=>
string '
1929-01-24
'
(length=
10
)
2
=>
object(stdClass)[
120
]
public '
id
'
=>
int 3
public '
nom
'
=>
string '
Avril
'
(length=
5
)
public '
prenom
'
=>
string '
Nicole
'
(length=
6
)
public '
naissance
'
=>
string '
1939-08-15
'
(length=
10
)
3
=>
object(stdClass)[
121
]
public '
id
'
=>
int 4
public '
nom
'
=>
string '
Pinger
'
(length=
6
)
public '
prenom
'
=>
string '
Robert
'
(length=
6
)
public '
naissance
'
=>
string '
1919-07-19
'
(length=
10
)
4
=>
object(stdClass)[
122
]
public '
id
'
=>
int 5
public '
nom
'
=>
string '
Sibran
'
(length=
6
)
public '
prenom
'
=>
string '
Anne
'
(length=
4
)
public '
naissance
'
=>
string '
1963-02-04
'
(length=
10
)
5
=>
object(stdClass)[
123
]
public '
id
'
=>
int 6
public '
nom
'
=>
string '
Saulers
'
(length=
7
)
public '
prenom
'
=>
string '
Pilippe
'
(length=
7
)
public '
naissance
'
=>
string '
1969-06-12
'
(length=
10
)
6
=>
object(stdClass)[
124
]
public '
id
'
=>
int 7
public '
nom
'
=>
string '
July
'
(length=
4
)
public '
prenom
'
=>
string '
Serge
'
(length=
5
)
public '
naissance
'
=>
string '
1942-12-27
'
(length=
10
)
Si on veut affiner la sélection il faut utiliser une clause where :
Si on sélectionne plusieurs enregistrements et qu'on désire seulement le premier :
$auteurs
=
DB::
table('
auteurs
'
)->
where('
nom
'
,
'
>
'
,
'
r
'
)->
first();
var_dump($auteurs
);
Si on veut juste une colonne d'un enregistrement :
$auteurs
=
DB::
table('
auteurs
'
)->
where('
id
'
,
2
)->
pluck('
nom
'
);
var_dump($auteurs
);
string '
Raspail
'
(length=
7
)
Si on veut seulement certaines colonnes :
$auteurs
=
DB::
table('
auteurs
'
)->
select('
nom
'
,
'
prenom
'
)->
where('
nom
'
,
'
>
'
,
'
r
'
)->
get();
var_dump($auteurs
);
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
array (size=
3
)
0
=>
object(stdClass)[
118
]
public '
nom
'
=>
string '
Raspail
'
(length=
7
)
public '
prenom
'
=>
string '
Jean
'
(length=
4
)
1
=>
object(stdClass)[
119
]
public '
nom
'
=>
string '
Sibran
'
(length=
6
)
public '
prenom
'
=>
string '
Anne
'
(length=
4
)
2
=>
object(stdClass)[
120
]
public '
nom
'
=>
string '
Saulers
'
(length=
7
)
public '
prenom
'
=>
string '
Pilippe
'
(length=
7
)
Combiner des clauses where :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
array (size=
3
)
0
=>
object(stdClass)[
118
]
public '
id
'
=>
int 1
public '
nom
'
=>
string '
Flaubert
'
(length=
8
)
public '
prenom
'
=>
string '
Gustave
'
(length=
7
)
public '
naissance
'
=>
string '
1821-12-12
'
(length=
10
)
1
=>
object(stdClass)[
119
]
public '
id
'
=>
int 5
public '
nom
'
=>
string '
Sibran
'
(length=
6
)
public '
prenom
'
=>
string '
Anne
'
(length=
4
)
public '
naissance
'
=>
string '
1963-02-04
'
(length=
10
)
2
=>
object(stdClass)[
120
]
public '
id
'
=>
int 6
public '
nom
'
=>
string '
Saulers
'
(length=
7
)
public '
prenom
'
=>
string '
Pilippe
'
(length=
7
)
public '
naissance
'
=>
string '
1969-06-12
'
(length=
10
)
Mettre une valeur dans un intervalle :
$auteurs
=
DB::
table('
auteurs
'
)->
whereBetween('
naissance
'
,
array('
1930-01-01
'
,
'
1960-01-01
'
))->
get();
var_dump($auteurs
);
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
array (size=
2
)
0
=>
object(stdClass)[
118
]
public '
id
'
=>
int 3
public '
nom
'
=>
string '
Avril
'
(length=
5
)
public '
prenom
'
=>
string '
Nicole
'
(length=
6
)
public '
naissance
'
=>
string '
1939-08-15
'
(length=
10
)
1
=>
object(stdClass)[
119
]
public '
id
'
=>
int 7
public '
nom
'
=>
string '
July
'
(length=
4
)
public '
prenom
'
=>
string '
Serge
'
(length=
5
)
public '
naissance
'
=>
string '
1942-12-27
'
(length=
10
)
Ordonner le résultat :
$auteurs
=
DB::
table('
auteurs
'
)->
select('
nom
'
)->
orderBy('
nom
'
,
'
desc
'
)->
get();
var_dump($auteurs
);
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
array (size=
7
)
0
=>
object(stdClass)[
118
]
public '
nom
'
=>
string '
Sibran
'
(length=
6
)
1
=>
object(stdClass)[
119
]
public '
nom
'
=>
string '
Saulers
'
(length=
7
)
2
=>
object(stdClass)[
120
]
public '
nom
'
=>
string '
Raspail
'
(length=
7
)
3
=>
object(stdClass)[
121
]
public '
nom
'
=>
string '
Pinger
'
(length=
6
)
4
=>
object(stdClass)[
122
]
public '
nom
'
=>
string '
July
'
(length=
4
)
5
=>
object(stdClass)[
123
]
public '
nom
'
=>
string '
Flaubert
'
(length=
8
)
6
=>
object(stdClass)[
124
]
public '
nom
'
=>
string '
Avril
'
(length=
5
)
Utiliser un offset et une limite :
$auteurs
=
DB::
table('
auteurs
'
)->
select('
nom
'
)->
skip(3
)->
take(2
)->
get();
var_dump($auteurs
);
Il existe encore bien d'autres possibilités et je vous renvoie à la documentation.
XIV-A-3. Les jointures▲
Il arrive souvent qu'on doive utiliser des jointures lorsque deux (ou plusieurs) tables sont concernées. Voici un exemple :
XIV-A-4. Mise à jour et suppression d'enregistrements▲
Voyons à présent une mise à jour :
int 1
On a en retour le nombre d'enregistrements affectés. Dans notre cas on a un seul enregistrement.
Voyons une suppression :
int 2
On a aussi en retour le nombre d'enregistrements affectés. Ici deux puisque nous avons supprimé les deux ouvrages d'Anne Sibran :
Je vous renvoie à la documentation pour toutes les informations complémentaires. Mais surtout, n'oubliez pas qu'elle est encore en évolution .