Laravel 4 : 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.

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 :

img50

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

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

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 :

img51Insertion 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 framework en version beta Tongue Out) :

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 :

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

On va aussi entrer quelques livres :

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')
    )
);

img53

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 :

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

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

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 :

$auteurs = DB::table('auteurs')->where('nom', 'Pinger')->get();
var_dump($auteurs);
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 :

$auteurs = DB::table('auteurs')->where('nom', '>', 'r')->first();
var_dump($auteurs);
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 :

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

$auteurs = DB::table('auteurs')->where('naissance', '<' , '1900-01-01')
                               ->orWhere('naissance', '>' , '1960-01-01')
                               ->get();
var_dump($auteurs);
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)

Une valeur dans un intervalle :

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

Les jointures

Il arrive souvent qu’on doive utiliser des jointures lorsque deux (ou plusieurs) tables sont concernées. Voici un exemple :

$livres = DB::table('livres')
    ->join('auteurs', 'auteurs.id', '=', 'livres.id_auteur')
    ->where('nom', '=', 'Raspail')
    ->select('titre')
    ->get();
var_dump($livres);
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)

Mise à jour et suppression d’enregistrements

Voyons à présent une mise à jour :

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

On a au retour le nombre d’enregistrement affectés. Dans notre cas un seul.

Voyons une suppression :

$livres = DB::table('livres')->where('id_auteur', '=', 5)->delete();
var_dump($livres);
int 2

On a aussi au retour le nombre d’enregistrements affectés. Ici 2 puisque nous avons supprimé les deux ouvrages d’Anne Sibran :

img54Je vous renvoie à la documentation pour toutes les informations complémentaires. Mais surtout n’oubliez pas qu’elle est encore en évolution Wink.

5 réflexions sur “Laravel 4 : chapitre 14 : Les bases de données 2/3

  1. duc_onlajoy dit :

    Bonjour,

    Tout d’abord bravo pour ces tutos progressifs très intéressants.

    J’ai essayé de faire un exercice en affichant les livres de chaque auteur.
    Mais je me suis heurté à une différence que j’ai encore du mal à comprendre.

    foreach (Auteur::all() as $auteur){
    var_dump($auteur->livres()); // renvoi un object(Illuminate\Database\Eloquent\Relations\HasMany)
    var_dump($auteur->livres); // renvoi un object(Illuminate\Database\Eloquent\Collection)
    }

    Le second est exploitable avec un foreach() mais comment exploiter le premier pour lister les livres de l’auteur ?

  2. Matt dit :

    Bravo pour ce blog et cette mine d’or sur L4 !
    Petite suggestion concernant cet article, utiliser « auteur_id » au lieu de « id_auteur » pour faire le lien avec l’article suivant et l’utilisation d’Eloquent.

Laisser un commentaire