Je souhaite obtenir des informations sur une formation complète concernant le thème DIVI dispensé
par un organisme de formation certifié par l’état.
Que la formation soit finançable par mon CPF (idéalement) ou autre


Eloquent est l’ORM standard fourni avec Laravel. Il implémente le modèle d’enregistrement actif et constitue un moyen simple d’interagir avec votre base de données. Chaque modèle individuel représente une table de votre base de données avec laquelle vous pouvez travailler. Dans cet article, nous allons vous montrer des secrets plus ou moins cachés, des méthodes et des propriétés que vous ne connaissez peut-être pas afin d’améliorer votre code.

Attributs de serpent

Les attributs du serpent sont intéressants. Regardons ce que dit le code:

/**
 * Indicates whether attributes are snake cased on arrays.
 *
 * @var bool
 */
public static $snakeAttributes = true;

Très souvent, les utilisateurs font une erreur en utilisant cette propriété pour modifier la façon dont les propriétés sont accessibles. Beaucoup de gens pensent que s’ils modifient cette propriété, ils peuvent facilement accéder aux attributs en utilisant l’annotation de cas de chameau. Ce n’est pas le cas. Nous vous déconseillons fortement de l’utiliser. Il n’est utilisé que pour définir s’il existe des attributs dans la peau de chameau ou de serpent lorsque le modèle est sorti sous forme de tableau.

Si vous souhaitez travailler sur une base de cas de chameau, nous vous recommandons de jeter un œil au package éloquence par Kirk Bushell.

Pagination

Si vous utilisez l’ORM éloquent de Laravel, vous avez de la chance. Il fournit un moyen simple de consulter immédiatement les résultats. Vous savez peut-être quelque chose comme ça:

$comments = Comment::paginate(20);

Cette méthode vous permet de paginer le modèle de commentaire avec 20 éléments par page. La modification de cette valeur vous permet de contrôler le nombre d’éléments affichés par page. Si vous ne spécifiez rien, la valeur par défaut 15 est utilisée.

Par exemple, disons que vous souhaitez afficher des commentaires à plusieurs endroits sur votre site Web. Toujours 30 commentaires par page. Ensuite, ce serait ennuyeux si vous deviez passer le paramètre 30 à chaque point. Vous pouvez donc définir une nouvelle valeur standard directement sur le modèle.

protected $perPage = 30;

Association de valeurs personnalisées aux modèles

Eloquent a une fonctionnalité intéressante appelée « Accesseurs ». Cette fonction vous permet d’ajouter des champs personnalisés à des modèles qui n’existent ni dans le modèle ni dans la table. Peu importe que vous utilisiez des valeurs existantes ou que vous en définissiez de nouvelles. Vous pouvez tout rendre. Voici un exemple du fonctionnement des accesseurs. En supposant qu’il existe un modèle appelé User où nous mettons le code ci-dessous.

function getFullNameAttribute() {
    return sprintf('%s %s', $this->first_name, $this->last_name);
}

Vous avez désormais accès à un full_name Attribut sur le modèle de poteau comme suit:

User::latest()->first()->full_name;

Le problème maintenant est que cet attribut n’est pas ajouté au modèle utilisateur lors du renvoi d’objets comme une collection. Ajouter le protégé $appends Attribut à votre modèle. Il accepte un tableau avec un ou plusieurs champs qui devraient être automatiquement ajoutés à partir de maintenant. Voici à quoi ça ressemble:

protected $appends = ['full_name'];

Mutateurs pour les colonnes inexistantes

Les mutateurs sont l’opposé des accesseurs. Vous pouvez les utiliser pour des choses vraiment cool. Par exemple, pour convertir différentes entrées. Laissez-nous vous montrer quelque chose. Imaginez que vous vouliez gagner du temps. Habituellement, vous enregistrez toujours la plus petite unité possible. Dans notre cas, secondes. Pour des raisons UX, l’utilisateur ne souhaite pas saisir de secondes, mais plutôt des minutes à un emplacement ou des heures à un autre emplacement, par exemple. Tout cela peut être résolu très rapidement.

class Video extends Model
{
    public function setDurationInMinutesAttribute($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60;
    }

    public function setDurationInHoursAttribute($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60 * 60;
    }
}

Qu’est-ce que ça veut dire? Cela signifie que vous pouvez utiliser la colonne qui n’existe pas duration_in_minutes sur le modèle, mais la colonne en arrière-plan duration_in_seconds Est mis à jour. La même chose s’applique à la colonne qui n’existe pas duration_in_hours. Cela conduit par exemple à la logique suivante:

class AnyController
{
    public function store()
    {
        $video->update([
            'title' => request('title'),
            'duration_in_minutes' => request('duration_in_minutes'),
        ]);
    }
}

Cela vous permet d’économiser le calcul dans le contrôle et vous pouvez simplement utiliser une colonne inexistante et utiliser un mutateur pour la mapper correctement à la colonne correcte pour certains calculs.

Chargement occupé avec $ avec

Parlons un peu des relations. Par défaut, Laravel utilise le chargement différé. Qu’est-ce que cela signifie pour les relations? La bonne chose est que le chargement paresseux économise de l’espace de stockage car toutes les données ne doivent pas être sauvegardées et nous chargeons les données en cas de besoin. Considérez cet exemple de code:

$comments = Comment::all();
foreach ($comments as $comment) {
    echo $comment->user->name;
}

Dans l’exemple ci-dessus, nous obtenons tous les commentaires. Ensuite, nous parcourons les commentaires et affichons le nom d’utilisateur pour chaque commentaire. Le code fonctionne, mais nous rencontrons un problème. Le chargement différé garantit désormais que la requête pour obtenir l’utilisateur n’est exécutée que lorsque le nom d’utilisateur doit être renvoyé.

Bienvenue dans votre premier problème N + 1. Pourquoi N + 1? N est toujours le nombre de commentaires et 1 est la requête pour obtenir les commentaires. Par exemple, si nous avons 500 commentaires, la requête pour obtenir tous les commentaires sera déclenchée une fois, puis une requête pour obtenir l’utilisateur correspondant – par commentaire. Donc 500 + 1 demandes. Cela signifie qu’à mesure que le nombre de commentaires augmente, le nombre de requêtes augmente également.

Pour éviter que cela ne se produise, il y a quelque chose appelé chargement hâtif.

$comments = Comment::with('user')->get();
foreach ($comments as $comment) {
    echo $comment->user->name;
}

Cela se termine par deux requêtes. La première requête obtient tous les commentaires et la deuxième requête obtient immédiatement tous les utilisateurs associés. Ce qui suit se produit en arrière-plan (simplifié):

SELECT id, user_id, body FROM comments;
SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);

Il n’est pas important que 10, 500 ou 10 000 commentaires soient récupérés à la fin. Il reste deux requêtes.

Vous avez maintenant vu comment utiliser la charge occupée. Mais comment l’utiliser manuellement. Vous pouvez également automatiser le tout, de sorte que certaines relations soient toujours chargées automatiquement en cas de chargement occupé. Il y a une propriété sur le modèle pour cela.

protected $with = [];

Nous pouvons donc simplement définir la propriété protected $with = ['user']; sur notre Comment Modèle, et à partir de maintenant l’utilisateur est automatiquement chargé à tout moment.

Il existe de nombreuses autres options en cas de chargement occupé. Chargement de colonnes spécifiques uniquement, chargement hâtif imbriqué, chargement hâtif multiple et bien plus encore. Rendez-vous dans la documentation Laravel ou plongez-vous profondément dans le cœur.

Clé de modèle

De temps en temps, il est nécessaire d’obtenir tous les ID d’une requête particulière. Peu importe qu’il s’agisse d’une requête complexe ou non. La plupart des gens feraient probablement ce qui suit:

User::all()->pluck('id');

Cela fonctionne très bien. Mais maintenant, vous récupérez une collection. Pour obtenir un tableau, vous devez le passer à cela toArray() Méthode encore.

User::all()->pluck('id')->toArray();

Dans la plupart des cas, cependant, cela peut être raccourci. Comme ça:

User::all()->modelKeys();

Cette méthode renvoie un tableau. Dans notre cas, les identifiants. Il est important de comprendre que cette méthode ne renvoie pas toujours nécessairement des ID. Comme son nom l’indique, toutes les clés primaires sont renvoyées sous forme de tableau. Les clés primaires peuvent être définies dans le modèle. La valeur par défaut est id.

protected $primaryKey = 'id';



Source link

Recent Posts