IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel pour apprendre à utiliser le framework Laravel 4


précédentsommairesuivant

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 :

Image non disponible

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):

 
Sélectionnez
1.
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):

 
Sélectionnez
1.
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 :

Image non disponible

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 :

 
Sélectionnez
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  ) :

 
Sélectionnez
1.
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 :

Image non disponible

Notez que la méthode insert renvoie true si l'insertion s'est bien effectuée.

On va aussi entrer quelques livres :

 
Sélectionnez
1.
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')
    )
);
Image non disponible

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 :

 
Sélectionnez
$auteurs = DB::table('auteurs')->get();
var_dump($auteurs);

On obtient un tableau avec toutes les données sous forme d'objets :

 
Sélectionnez
1.
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 :

 
Sélectionnez
$auteurs = DB::table('auteurs')->where('nom', 'Pinger')->get();
var_dump($auteurs);
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
array (size=1)
0 =>
object(stdClass)[118]
public 'id' => int 4
public 'nom' => string 'Pinger' (length=6)
public 'prenom' => string 'Robert' (length=6)
public 'naissance' => string '1919-07-19' (length=10)

Si on sélectionne plusieurs enregistrements et qu'on désire seulement le premier :

 
Sélectionnez
$auteurs = DB::table('auteurs')->where('nom', '>', 'r')->first();
var_dump($auteurs);
 
Sélectionnez
1.
2.
3.
4.
5.
object(stdClass)[118]
public 'id' => int 2
public 'nom' => string 'Raspail' (length=7)
public 'prenom' => string 'Jean' (length=4)
public 'naissance' => string '1929-01-24' (length=10)

Si on veut juste une colonne d'un enregistrement :

 
Sélectionnez
$auteurs = DB::table('auteurs')->where('id', 2)->pluck('nom');
var_dump($auteurs);
 
Sélectionnez
string 'Raspail' (length=7)

Si on veut seulement certaines colonnes :

 
Sélectionnez
$auteurs = DB::table('auteurs')->select('nom', 'prenom')->where('nom', '>', 'r')->get();
var_dump($auteurs);
 
Sélectionnez
1.
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 :

 
Sélectionnez
1.
2.
3.
4.
$auteurs = DB::table('auteurs')->where('naissance', '<' , '1900-01-01')
                               ->orWhere('naissance', '>' , '1960-01-01')
                               ->get();
var_dump($auteurs);
 
Sélectionnez
1.
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 :

 
Sélectionnez
$auteurs = DB::table('auteurs')->whereBetween('naissance', array('1930-01-01', '1960-01-01'))->get();
var_dump($auteurs);
 
Sélectionnez
1.
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 :

 
Sélectionnez
$auteurs = DB::table('auteurs')->select('nom')->orderBy('nom', 'desc')->get();
var_dump($auteurs);
 
Sélectionnez
1.
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 :

 
Sélectionnez
$auteurs = DB::table('auteurs')->select('nom')->skip(3)->take(2)->get();
var_dump($auteurs);
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
array (size=2)
0 =>
object(stdClass)[118]
public 'nom' => string 'Pinger' (length=6)
1 =>
object(stdClass)[119]
public 'nom' => string 'Sibran' (length=6)

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
$livres = DB::table('livres')
    ->join('auteurs', 'auteurs.id', '=', 'livres.id_auteur')
    ->where('nom', '=', 'Raspail')
    ->select('titre')
    ->get();
var_dump($livres);
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
array (size=3)
0 =>
object(stdClass)[119]
public 'titre' => string 'Secouons le cocotier' (length=20)
1 =>
object(stdClass)[120]
public 'titre' => string 'Pêcheurs de Lune' (length=17)
2 =>
object(stdClass)[121]
public 'titre' => string 'Les Royaumes de Borée' (length=22)

XIV-A-4. Mise à jour et suppression d'enregistrements

Voyons à présent une mise à jour :

 
Sélectionnez
1.
2.
3.
4.
$livres = DB::table('livres')
    ->where('titre', '=', 'Pêcheurs de Lune')
    ->update(array('id_auteur' => 3));
var_dump($livres);
 
Sélectionnez
int 1

On a en retour le nombre d'enregistrements affectés. Dans notre cas on a un seul enregistrement.

Voyons une suppression :

 
Sélectionnez
$livres = DB::table('livres')->where('id_auteur', '=', 5)->delete();
var_dump($livres);
 
Sélectionnez
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 :

Image non disponible

Je vous renvoie à la documentation pour toutes les informations complémentaires. Mais surtout, n'oubliez pas qu'elle est encore en évolution Image non disponible.


précédentsommairesuivant

Copyright © 2017 Laravel. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.