Sélectionner une page

Le but ici n’est pas de refaire la documentation de référence mais plutôt de donner d’une part quelques exemples et d’autre part de mettre en avant quelques fonctions bien utiles. 
C’est une librairie de fonctions que j’utilise fréquemment et qu’il me faut souvent copier pour ne pas faire d’erreurs.

Join: lier 2 tables sur un champ

Exemple tout simple d’un requête join qui lie 2 tables en fonction d’un champ.

$favorites = DB::table('favoris')
	->join('annonces', 'annonces.id', '=', 'favoris.idannonce')   
	->select('annonces.genre', 'favoris.*') 
	->where('favoris.iduser','=',$current_user_id)
	->whereNull('bla_bla');
	->whereNotNull('bla_bla_bla')
	->get();

Exemple d’une requête imbriquée

Exemple suivant montre comment créer une requête imbriquée en utilisant une variable pour la condition. La variable doit être passée avec le mot-clé use.

$allads = DB::table('anonnces')
	->join('anonnces_lang', function ($join)  use ($lang)  {
		$join->on('anonnces.id', '=', 'anonnces_lang.idfiche')
		->where('anonnces_lang.lang', $lang);
	})
	->select('anonnces.*', 'anonnces_lang.ville','anonnces_lang.ville_url')
	->orderBy('ville', 'asc')
	->whereNull('date_pause')
	->where('date_fin','>',date("Y-m-d H:i:s") )->get(); 

Champ calculé, raw sql

Exemple d’une requête générée par Laravel qui contient entre autres des champs calculés par le moteur de base de données.

$annonces = DB::table('annonces')
    ->select(DB::raw("annonces.id, annonces.name,
        if(`date_fin`<'".date("Y-m-d H:i:s")."',1,0) as annonce_active,
        if(`date_pause` is null,0,1) as annonce_pause
    "))
    ->where('name','like','a%')
    ->orderBy('created_at', 'asc') 
->get();

Champ calculé pour retourner un count avec un group by

Exemple d’une requête générée par Laravel qui contient entre autres des valeurs count avec un group by

$reviews = DB::table('reviews')
        ->select(DB::raw('count(*) as nb_reviews, idads'))
        ->where('status', 1)
        ->groupBy('idads')
        ->get();

$cronlog = DB::table('cron_log')
        ->select("*",DB::raw(" TIMESTAMPDIFF(SECOND,date_start,date_end) as duration"))
        ->orderBy('status','desc');

Comparer 2 champs dans une table

Dans certains cas, il est utile de comparer 2 champs dans une table. Dans mon cas, j’utilise cela pour ajouter une latence à une action. Ma cron a besoin de comparer le plus vite possible 2 champs. Pour effectuer une telle action, j’utilise la fonction whereRaw de la façon suivante:

$all = DB::table('annonces')->whereRaw('npa!=last_npa')->get();

Incrémenter, décrémenter un champ

Le système de génération de requête fournit également des méthodes pratiques pour incrémenter ou décrémenter un champ du nombre que vous désirez, et même modifier des valeurs en même temps.

//ajoute 1 au champ views
DB::table('annonces')->where('id', $idannonce)->increment('views');
//enlève 3 au champs views
DB::table('annonces')->where('id', $idannonce)->decrement('views',3);
//incrément de 1 le champs vue et ajoute la date du jour dans le champs last_view
DB::table('annonces')->where('id', $idannonce)->increment('views',1,['last_view'=>date('Y-m-d')]);
//il n'est pas possible d’incrémenter 2 champs en même temps. Pour réaliser cela, il faut faire:
DB::table('banner_pub')->where('id', 1)
   ->update([
      'view' => DB::raw('view + 1'),
      'view_day' => DB::raw('view_day + 1')
   ]);

Modifier des données avec la fonction update

//Modifier 1 champ 
DB::table('annonces')->where('id', $idannonce)->update(['ma_var' =>9]);
//Modifier plusieurs champs
DB::table('annonces')->update(['ma_var' => 0,'ma_var2'=>0]);
DB::table('annonces')->where('id', $idannonce)->update(['ma_var' => 0,'ma_var2'=>0]);
//Mettre champ a null
DB::table('annonces')->where('id',$idannonce)->update(['review_date' =>null]);

Utilisation de where, orWhere et whereIn

Les exemples suivants montrent comment utilise where ou orwhere en hiérarchisant les where. C’est compliqué a expliquer mais je pense que l’exemple suivant va vous le faire comprendre. Je montre aussi une utilisation de whereIn.

$yestrerday=date('Y-m-d H:i:s', strtotime("-1 days"));
$annonces = DB::table('annonces')
	->where('date_fin','<',$yestrerday)
	->orWhere('member_premium',1)
        ->limit(10)
	->get(); 

// Faire plusieurs OU sur des champs 
$fiches = DB::table('annonces')
->where('id',$idannonce)  
->where(function ($query) use ($iduser) {
	$query->where('iduser',$iduser)
	->orWhere('idvendeur',$iduser);
})
->get(); 
// Where avec un tableau de valeurs
$log = DB::table('log_fiche')
->whereIn('type_action', ['update', 'delete','reset'])
->get();