{"id":69810,"date":"2023-06-07T18:13:40","date_gmt":"2023-06-07T17:13:40","guid":{"rendered":"https:\/\/kinsta.com\/fr\/?p=69810&#038;preview=true&#038;preview_id=69810"},"modified":"2024-10-04T10:44:17","modified_gmt":"2024-10-04T09:44:17","slug":"relations-laravel-eloquent","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/","title":{"rendered":"Relations Laravel Eloquent : Un guide avanc\u00e9"},"content":{"rendered":"<p>Il y a souvent un moment dans la vie de tout d\u00e9veloppeur o\u00f9 vous devez interagir avec une base de donn\u00e9es. C&rsquo;est l\u00e0 qu&rsquo;Eloquent, le mappeur objet-relationnel (Object-Relational Mapper ou ORM) de Laravel, rend le processus d&rsquo;interaction avec les tables de votre base de donn\u00e9es intuitif et naturel.<\/p>\n<p>En tant que professionnel, il est essentiel que vous reconnaissiez et compreniez les six types de relations cl\u00e9s que nous allons passer en revue.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Que sont les relations dans Eloquent ?<\/h2>\n<p>Lorsque vous travaillez avec des tables dans une base de donn\u00e9es relationnelle, nous pouvons caract\u00e9riser les relations comme des connexions entre les tables. Cela vous aide \u00e0 organiser et \u00e0 structurer les donn\u00e9es sans effort, ce qui permet une meilleure lisibilit\u00e9 et une meilleure manipulation des donn\u00e9es. En pratique, il existe trois types de relations dans les bases de donn\u00e9es :<\/p>\n<ul>\n<li>une \u00e0 une &#8211; Un enregistrement dans une table est associ\u00e9 \u00e0 une, et une seule, dans une autre table. Par exemple, une personne et un num\u00e9ro de s\u00e9curit\u00e9 sociale.<\/li>\n<\/ul>\n<ul>\n<li>une-\u00e0-plusieurs &#8211; Un enregistrement est associ\u00e9 \u00e0 plusieurs enregistrements dans une autre table. Par exemple, un \u00e9crivain et ses blogs.<\/li>\n<\/ul>\n<ul>\n<li>plusieurs \u00e0 plusieurs &#8211; Plusieurs enregistrements d&rsquo;une table sont associ\u00e9s \u00e0 plusieurs enregistrements d&rsquo;une autre table. Par exemple, les \u00e9tudiants et les cours auxquels ils sont inscrits.<\/li>\n<\/ul>\n<p>Laravel permet d&rsquo;interagir et de g\u00e9rer les relations entre les bases de donn\u00e9es en utilisant la syntaxe orient\u00e9e objet d&rsquo;Eloquent.<\/p>\n<p>En plus de ces d\u00e9finitions, Laravel introduit d&rsquo;autres relations, \u00e0 savoir :<\/p>\n<ul>\n<li>Has Many Through<\/li>\n<li>Relations polymorphes<\/li>\n<li>Plusieurs-\u00e0-plusieurs Polymorphes<\/li>\n<\/ul>\n<p>Prenons l&rsquo;exemple d&rsquo;un magasin dont l&rsquo;inventaire contient une vari\u00e9t\u00e9 d&rsquo;articles, chacun dans sa propre cat\u00e9gorie. Il est donc logique, d&rsquo;un point de vue commercial, de diviser la base de donn\u00e9es en plusieurs tables. Cela pose des probl\u00e8mes, car vous ne souhaitez pas interroger chaque table.<\/p>\n<p>Nous pouvons facilement cr\u00e9er une simple relation un-\u00e0-plusieurs dans Laravel pour nous aider, par exemple lorsque nous avons besoin d&rsquo;interroger les produits, nous pouvons le faire en utilisant le mod\u00e8le Product.<\/p>\n<figure style=\"width: 1158px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/05\/pasted-image-0-6.png\" alt=\"Sch\u00e9ma de base de donn\u00e9es avec trois tables et une table commune repr\u00e9sentant une relation polymorphe\" width=\"1158\" height=\"610\"><figcaption class=\"wp-caption-text\">Sch\u00e9ma de base de donn\u00e9es avec trois tables et une table commune repr\u00e9sentant une relation polymorphe<\/figcaption><\/figure>\n<h2>Relation un-\u00e0-un<\/h2>\n<p>Premi\u00e8re relation de base propos\u00e9e par Laravel, elle associe deux tables de mani\u00e8re \u00e0 ce qu&rsquo;une ligne de la premi\u00e8re table soit corr\u00e9l\u00e9e \u00e0 une seule ligne de l&rsquo;autre table.<\/p>\n<p>Pour voir cela en action, nous devons cr\u00e9er deux mod\u00e8les avec leur propre migration :<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Tenant \nPhp artisan make:model Rent<\/code><\/pre>\n<p>\u00c0 ce stade, nous avons deux mod\u00e8les, l&rsquo;un \u00e9tant le locataire et l&rsquo;autre son loyer.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Tenant extends Model\n{\n    \/**\n    * Get the rent of a Tenant\n    *\/\n    public function rent() \n    {\n        return $this-&gt;hasOne(Rent::class);\n    }\n}<\/code><\/pre>\n<p>Comme Eloquent d\u00e9termine la relation de cl\u00e9 \u00e9trang\u00e8re en se basant sur le nom du mod\u00e8le parent (Tenant dans ce cas), le mod\u00e8le Rent suppose qu&rsquo;il existe une cl\u00e9 \u00e9trang\u00e8re <strong>tenant_id.<\/strong><\/p>\n<p>Nous pouvons facilement l&rsquo;\u00e9craser en ajoutant un argument suppl\u00e9mentaire \u00e0 la m\u00e9thode <strong>hasOne<\/strong>:<\/p>\n<pre><code class=\"language-php\">return $this- &gt;hasOne(Rent::class, \"custom_key\");<\/code><\/pre>\n<p>Eloquent suppose \u00e9galement qu&rsquo;il existe une correspondance entre la cl\u00e9 \u00e9trang\u00e8re d\u00e9finie et la cl\u00e9 primaire du parent (mod\u00e8le Tenant). Par d\u00e9faut, il cherchera \u00e0 faire correspondre <strong>tenant_id<\/strong> avec la cl\u00e9 <strong>id<\/strong> de l&rsquo;enregistrement Tenant. Nous pouvons remplacer cela par un troisi\u00e8me argument dans la m\u00e9thode <strong>hasOne<\/strong>, de mani\u00e8re \u00e0 ce qu&rsquo;il corresponde \u00e0 une autre cl\u00e9 :<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class, \"custom_key\", \"other_key\"); <\/code><\/pre>\n<p>Maintenant que nous avons d\u00e9fini la relation biunivoque entre les mod\u00e8les, nous pouvons l&rsquo;utiliser facilement, comme ci-dessous :<\/p>\n<pre><code class=\"language-php\">$rent = Tenant::find(10)-&gt;rent;<\/code><\/pre>\n<p>Avec cette ligne de code, nous obtenons le loyer du locataire avec l&rsquo;identifiant 10 s&rsquo;il existe.<\/p>\n<h2>Relation d&rsquo;un \u00e0 plusieurs<\/h2>\n<p>Comme la relation pr\u00e9c\u00e9dente, celle-ci d\u00e9finira les relations entre un mod\u00e8le monoparental et plusieurs mod\u00e8les enfants. Il est peu probable que notre locataire n&rsquo;ait qu&rsquo;une seule facture de loyer, car il s&rsquo;agit d&rsquo;un paiement r\u00e9current ; il aura donc plusieurs paiements.<\/p>\n<p>Dans ce cas, notre relation pr\u00e9c\u00e9dente pr\u00e9sente des d\u00e9fauts et nous pouvons les corriger :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Tenant extends Model\n{\n    \/**\n    * Get the rents of a Tenant\n    *\/\n    public function rent() \n    {\n        return $this-&gt;hasMany(Rent::class);\n    }\n}<\/code><\/pre>\n<p>Avant d&rsquo;appeler la m\u00e9thode pour obtenir les loyers, il est bon de savoir que les relations servent \u00e0 construire des requ\u00eates, de sorte que nous pouvons ajouter des contraintes (comme un loyer entre deux dates, un paiement minimum, etc :<\/p>\n<pre><code class=\"language-php\">$rents = Tenant::find(10)-&gt;rent()-&gt;where('payment', '&gt;', 500)-&gt;first();<\/code><\/pre>\n<p>Et comme pour la relation pr\u00e9c\u00e9dente, nous pouvons \u00e9craser les cl\u00e9s \u00e9trang\u00e8res et locales en passant des arguments suppl\u00e9mentaires :<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasMany(Rent::class, \"foreign_key\");<\/code><\/pre>\n<pre><code class=\"language-php\">return $this-&gt;hasMany(Rent::class, \"foreign_key\", \"local_key\");<\/code><\/pre>\n<p>Nous disposons d\u00e9sormais de tous les loyers d&rsquo;un locataire, mais que faire lorsque nous connaissons le loyer et que nous voulons savoir \u00e0 qui il appartient ? Nous pouvons utiliser la propri\u00e9t\u00e9 <strong>belongsTo <\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Rent extends Model\n{\n    \/**\n    * Return the tenant for the rent\n    *\/\n    public function tenant() \n    {\n        return $this-&gt;belongsTo(Tenant::class);\n    }\n}<\/code><\/pre>\n<p>Et maintenant, nous pouvons facilement trouver le locataire :<\/p>\n<pre><code class=\"language-php\">$tenant = Rent::find(1)-&gt;tenant;<\/code><\/pre>\n<p>Pour la m\u00e9thode <strong>belongsTo<\/strong>, nous pouvons \u00e9galement \u00e9craser les cl\u00e9s \u00e9trang\u00e8res et locales comme nous l&rsquo;avons fait pr\u00e9c\u00e9demment.<\/p>\n<h2>Relation de type un sur plusieurs (Has-One-Of-Many)<\/h2>\n<p>\u00c9tant donn\u00e9 que notre mod\u00e8le Locataire peut \u00eatre associ\u00e9 \u00e0 de nombreux mod\u00e8les Location, nous voulons facilement r\u00e9cup\u00e9rer le mod\u00e8le le plus r\u00e9cent ou le plus ancien des relations.<\/p>\n<p>Une fa\u00e7on pratique de le faire est de combiner les m\u00e9thodes <strong>hasOne<\/strong> et <strong>ofMany <\/strong>:<\/p>\n<pre><code class=\"language-php\">public function latestRent() {\n    return $this-&gt;hasOne(Rent::class)-&gt;latestOfMany();\n}\n\npublic function oldestRent() {\n    return $this-&gt;hasOne(Rent::class)-&gt;oldestOfMany();\n}<\/code><\/pre>\n<p>Par d\u00e9faut, nous r\u00e9cup\u00e9rons les donn\u00e9es sur la base de la cl\u00e9 primaire, qui peut \u00eatre tri\u00e9e, mais nous pouvons cr\u00e9er nos propres filtres pour la m\u00e9thode <strong>ofMany <\/strong>:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class)-&gt;ofMany('price', 'min');<\/code><\/pre>\n<h2>Relations HasOneThrough et HasManyThrough<\/h2>\n<p>Les m\u00e9thodes <strong>-Through <\/strong>sugg\u00e8rent que nos mod\u00e8les devront passer par un autre mod\u00e8le pour \u00e9tablir une relation avec le mod\u00e8le souhait\u00e9. Par exemple, nous pouvons associer le loyer au propri\u00e9taire, mais le loyer doit d&rsquo;abord passer par le locataire pour atteindre le propri\u00e9taire.<\/p>\n<p>Les cl\u00e9s des tables n\u00e9cessaires \u00e0 cet effet ressembleraient \u00e0 ceci :<\/p>\n<pre><code class=\"language-bash\">rent\n    id - integer\n    name - string\n    value - double\n\ntenants\n    id - integer\n    name - string\n    rent_id - integer\n\nlandlord\n    id - integer\n    name - string\n    tenant_id - integer<\/code><\/pre>\n<p>Apr\u00e8s avoir visualis\u00e9 l&rsquo;aspect de nos tables, nous pouvons cr\u00e9er les mod\u00e8les :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Rent extends Model\n{\n    \/**\n    * Return the rents' landlord\n    *\/\n    public function rentLandlord() \n    {\n        return $this-&gt;hasOneThrough(Landlord::class, Tenant::class);\n    }\n}<\/code><\/pre>\n<p>Le premier argument de la m\u00e9thode <strong>hasOneThrough<\/strong> est le mod\u00e8le auquel vous voulez acc\u00e9der, et le deuxi\u00e8me argument est le mod\u00e8le que vous allez traverser.<\/p>\n<p>Et comme pr\u00e9c\u00e9demment, vous pouvez \u00e9craser les cl\u00e9s \u00e9trang\u00e8res et locales. Maintenant que nous avons deux mod\u00e8les, nous en avons deux de chaque \u00e0 \u00e9craser dans cet ordre :<\/p>\n<pre><code class=\"language-php\">public function rentLandlord() \n{\n    return $this-&gt;hasOneThrough(\n        Landlord::class,\n        Tenant::class,\n        \"rent_id\",    \/\/ Foreign key on the tenant table\n        \"tenant_id\",  \/\/ Foreign key on the landlord table\n        \"id\",         \/\/ Local key on the tenant class\n        \"id\"          \/\/ Local key on the tenant table\n    );\n}<\/code><\/pre>\n<p>De m\u00eame, la relation \u00ab Has Many Through \u00bb de Laravel Eloquent est utile lorsque vous souhaitez acc\u00e9der aux enregistrements d&rsquo;une table distante par le biais d&rsquo;une table interm\u00e9diaire. Prenons un exemple avec trois tables :<\/p>\n<ul>\n<li>country<\/li>\n<li>users<\/li>\n<li>games<\/li>\n<\/ul>\n<p>Chaque pays a plusieurs utilisateurs et chaque utilisateur a plusieurs jeux. Nous voulons r\u00e9cup\u00e9rer tous les jeux appartenant \u00e0 un pays dans la table users<\/p>\n<p>Vous devez d\u00e9finir les tables comme suit :<\/p>\n<pre><code class=\"language-bash\">country\n    id - integer\n    name - string\n\nuser\n    id - integer\n    country_id - integer\n    name - string\n\ngames\n    id - integer\n    user_id - integer\n    title - string<\/code><\/pre>\n<p>Vous devez maintenant d\u00e9finir le mod\u00e8le Eloquent pour chaque table :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Country extends Model\n{\n    protected $fillable = ['name'];\n\n    public function users()\n    {\n        return $this-&gt;hasMany(User::class);\n    }\n\n    public function games()\n    {\n        return $this-&gt;hasManyThrough(Games::class, User::class);\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass User extends Model\n{\n    protected $fillable = [article_id, 'name'];\n\n    public function country()\n    {\n        return $this-&gt;belongsTo(Country::class);\n    }\n\n    public function posts()\n    {\n        return $this-&gt;hasMany(Post::class);\n    }\n}<\/code><\/pre>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Game extends Model\n{\n    protected $fillable = ['user_id', 'title'];\n\n    public function user()\n    {\n        return $this-&gt;belongsTo(User::class);\n    }\n}<\/code><\/pre>\n<p>Nous pouvons maintenant appeler la m\u00e9thode <strong>games() <\/strong>du mod\u00e8le Pays pour obtenir tous les jeux, car nous avons \u00e9tabli la relation \u00ab Has Many Through \u00bb entre Pays et Jeu par l&rsquo;interm\u00e9diaire du mod\u00e8le Utilisateur.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n$country = Country::find(159);\n            \n\/\/ Retrieve all games for the country\n$games = $country-&gt;games;<\/code><\/pre>\n<h2>Relation de plusieurs \u00e0 plusieurs<\/h2>\n<p>La relation de plusieurs \u00e0 plusieurs est plus compliqu\u00e9e. Un bon exemple est celui d&rsquo;un employ\u00e9 qui a plusieurs r\u00f4les. Un r\u00f4le peut \u00e9galement \u00eatre attribu\u00e9 \u00e0 plusieurs employ\u00e9s. C&rsquo;est la base de la relation de plusieurs \u00e0 plusieurs.<\/p>\n<p>Pour cela, nous devons disposer des tables <strong>employees<\/strong>, <strong>roles<\/strong> et <strong>role_employees <\/strong>.<\/p>\n<p>La structure des tables de notre base de donn\u00e9es se pr\u00e9sente comme suit :<\/p>\n<pre><code class=\"language-bash\">employees\n    id - integer\n    name - string\n\nroles \n    id - integer\n    name - string\n\nrole_employees\n    user_id - integer\n    role_id - integer<\/code><\/pre>\n<p>En connaissant la structure des tables de la relation, nous pouvons facilement d\u00e9finir notre <strong>mod\u00e8le Employ\u00e9<\/strong> comme <strong>appartenant \u00e0 plusieurs<\/strong> <strong>mod\u00e8les<\/strong> <strong>R\u00f4le<\/strong>.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Employee extends Model\n{\n    public function roles() \n    {\n        return $this- &gt;belongsToMany(Role::class);\n    }\n}<\/code><\/pre>\n<p>Une fois cette d\u00e9finition effectu\u00e9e, nous pouvons acc\u00e9der \u00e0 tous les r\u00f4les d&rsquo;un employ\u00e9 et m\u00eame les filtrer :<\/p>\n<pre><code class=\"language-php\">$employee = Employee::find(1);\n$employee-&gt;roles-&gt;forEach(function($role) { \/\/ });\n\n\/\/ OR \n\n$employee = Employee::find(1)-&gt;roles()-&gt;orderBy('name')-&gt;where('name', 'admin')-&gt;get();<\/code><\/pre>\n<p>Comme toutes les autres m\u00e9thodes, nous pouvons \u00e9craser les cl\u00e9s \u00e9trang\u00e8res et locales de la m\u00e9thode <strong>belongsToMany<\/strong>.<\/p>\n<p>Pour d\u00e9finir la relation inverse de la m\u00e9thode <strong>belongsToMany<\/strong>, il suffit d&rsquo;utiliser la m\u00eame m\u00e9thode, mais sur la m\u00e9thode enfant, avec le parent comme argument.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Role extends Model\n{\n    public function employees() \n    {\n        return $this-&gt;belongsToMany(Employee::class);\n    }\n}<\/code><\/pre>\n<h3>Utilisations de la table interm\u00e9diaire<\/h3>\n<p>Comme nous l&rsquo;avons peut-\u00eatre remarqu\u00e9, lorsque nous utilisons la relation plusieurs-\u00e0-plusieurs, nous sommes toujours cens\u00e9s avoir une table interm\u00e9diaire. Dans ce cas, nous utilisons la table <strong>role_employees<\/strong>.<\/p>\n<p>Par d\u00e9faut, notre tableau crois\u00e9 dynamique ne contient que les attributs id. Si nous voulons d&rsquo;autres attributs, nous devons les sp\u00e9cifier comme suit :<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withPivot(\"active\", \"created_at\");<\/code><\/pre>\n<p>Si nous voulons raccourcir le tableau crois\u00e9 dynamique pour les horodatages, nous pouvons le faire :<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withTimestamps();<\/code><\/pre>\n<p>Il faut savoir que nous pouvons personnaliser le nom \u00ab pivot \u00bb pour qu&rsquo;il corresponde mieux \u00e0 notre application :<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;as('subscription')-&gt;withPivot(\"active\", \"created_by\");<\/code><\/pre>\n<p>Filtrer les r\u00e9sultats d&rsquo;une requ\u00eate \u00e9loquente est un must pour tout d\u00e9veloppeur qui souhaite am\u00e9liorer son jeu et <a href=\"https:\/\/kinsta.com\/fr\/blog\/methodes-optimisation-performances-laravel\/\">optimiser ses applications Laravel<\/a>.<\/p>\n<p>C&rsquo;est pourquoi Laravel propose une fonctionnalit\u00e9 fantastique, les pivots, qui peuvent \u00eatre utilis\u00e9s pour filtrer les donn\u00e9es que nous voulons collecter. Ainsi, au lieu d&rsquo;utiliser d&rsquo;autres fonctionnalit\u00e9s comme les <a href=\"https:\/\/kinsta.com\/fr\/blog\/base-de-donnees-laravel\/\">transactions de base de donn\u00e9es<\/a> pour obtenir nos donn\u00e9es en morceaux, nous pouvons les filtrer avec des m\u00e9thodes utiles comme <strong>wherePivot, wherePivotIn, wherePivotNotIn, wherePivotBetween, wherePivotNotBetween, wherePivotNull, wherePivotNotNull<\/strong> et nous pouvons les utiliser lors de la d\u00e9finition des relations entre les tables !<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;wherePivot('promoted', 1);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotIn('level', [1, 2]);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotNotIn('level', [2, 3]);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotBetween('posted_at', ['2023-01-01 00:00:00', '2023-01-02 00:00:00']);\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotNull('expired_at');\nreturn $this-&gt;belongsToMany(Employee::class)-&gt;wherePivotNotNull('posted_at');<\/code><\/pre>\n<p>Une derni\u00e8re fonctionnalit\u00e9 \u00e9tonnante est la possibilit\u00e9 de classer les pivots :<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)\n        -&gt;where('promoted', true)\n        -&gt;orderByPivot('hired_at', 'desc');<\/code><\/pre>\n<h2>Relations polymorphes<\/h2>\n<p>Le mot \u00ab polymorphe \u00bb vient du grec et signifie \u00ab plusieurs formes \u00bb Ainsi, un mod\u00e8le dans notre application peut prendre plusieurs formes, ce qui signifie qu&rsquo;il peut avoir plus d&rsquo;une association. Imaginez que nous construisions une application avec des blogs, des vid\u00e9os, des sondages, etc. Un utilisateur peut cr\u00e9er un commentaire pour chacun de ces \u00e9l\u00e9ments. Un utilisateur peut cr\u00e9er un commentaire pour n&rsquo;importe lequel de ces \u00e9l\u00e9ments. Par cons\u00e9quent, un <strong>mod\u00e8le Commentaire<\/strong> peut appartenir aux mod\u00e8les <strong>Blogs<\/strong>, <strong>Vid\u00e9os<\/strong> et <strong>Sondages<\/strong>.<\/p>\n<h2>Polymorphe un \u00e0 un<\/h2>\n<p>Ce type de relation est similaire \u00e0 une relation univoque standard. La seule diff\u00e9rence est que le mod\u00e8le enfant peut appartenir \u00e0 plusieurs types de mod\u00e8les avec une seule association.<\/p>\n<p>Prenez, par exemple, un mod\u00e8le <strong>Locataire <\/strong>et <strong>Propri\u00e9taire<\/strong>, il peut partager une relation polymorphe avec un mod\u00e8le <strong>Facture d&rsquo;eau<\/strong>.<\/p>\n<p>La structure de la table peut \u00eatre la suivante :<\/p>\n<pre><code class=\"language-bash\">tenants\n    id \u2013 integer\n    name \u2013 string\n\nlandlords\n    id \u2013 integer\n    name \u2013 string\n\nwaterbills\n    id \u2013 integer\n    amount \u2013 double\n    waterbillable_id\n    waterbillable_type<\/code><\/pre>\n<p>Nous utilisons waterbillable_id pour l&rsquo;identifiant du <strong>propri\u00e9taire <\/strong>ou du <strong>locataire, <\/strong>tandis que waterbillable_type contient le nom de la classe du mod\u00e8le parent. La colonne type est utilis\u00e9e par Eloquent pour d\u00e9terminer le mod\u00e8le parent \u00e0 retourner.<\/p>\n<p>La d\u00e9finition du mod\u00e8le pour une telle relation se pr\u00e9sente comme suit :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass WaterBill extends Model\n{\n    public function billable()\n    {\n        return $this-&gt;morphTo();\n    }\n}\n\nclass Tenant extends Model\n{\n    public function waterBill()    \n    {\n        return $this-&gt;morphOne(WaterBill::class, 'billable');\n    }\n}\n\nclass Landlord extends Model\n{\n    public function waterBill()    \n    {\n        return $this-&gt;morphOne(WaterBill::class, 'billable');\n    }\n}<\/code><\/pre>\n<p>Une fois que tout cela est en place, nous pouvons acc\u00e9der aux donn\u00e9es du mod\u00e8le du propri\u00e9taire et du locataire :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n$tenant = Tenant::find(1)-&gt;waterBill;\n$landlord = Landlord::find(1)-&gt;waterBill;<\/code><\/pre>\n<h2>Une relation polymorphe de type un \u00e0 plusieurs<\/h2>\n<p>Il s&rsquo;agit d&rsquo;une relation similaire \u00e0 une relation classique de type \u00ab un \u00e0 plusieurs \u00bb, la seule diff\u00e9rence essentielle \u00e9tant que le mod\u00e8le enfant peut appartenir \u00e0 plusieurs types de mod\u00e8les, en utilisant une seule association.<\/p>\n<p>Dans une application comme Facebook, les utilisateurs peuvent commenter des messages, des vid\u00e9os, des sondages, des \u00e9v\u00e9nements en direct, etc. Avec une association polymorphe, nous pouvons utiliser une seule table de <strong>commentaires<\/strong> pour stocker les commentaires de toutes les cat\u00e9gories que nous avons. La structure de notre table ressemblerait \u00e0 ceci :<\/p>\n<pre><code class=\"language-bash\">posts \n    id \u2013 integer\n    title \u2013 string\n    body \u2013 text\n\nvideos\n    id \u2013 integer\n    title \u2013 string\n    url \u2013 string\n\npolls\n    id \u2013 integer\n    title \u2013 string\n\ncomments \n    id \u2013 integer\n    body \u2013 text\n    commentable_id \u2013 integer\n    commentable_type \u2013 string<\/code><\/pre>\n<p>Le commentable_id \u00e9tant l&rsquo;identifiant de l&rsquo;enregistrement, et le commentable_type \u00e9tant le type de classe, de sorte qu&rsquo;eloquent sache ce qu&rsquo;il doit chercher. Quant \u00e0 la structure du mod\u00e8le, elle est tr\u00e8s similaire \u00e0 la structure polymorphe one-to-many :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-a2d86b9b-54c3-4c01-bda2-b9550b681df6\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-84f8c80d-5e13-464a-9a6b-9da2a02ef632\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e261f047-0a44-4c11-ab19-4dd40f98adbb\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-cd2fb34f-57c0-4f73-acf2-54f72bd60aa0\" class=\"textannotation\">Model<\/span>;\n\nclass Comment extends Model \n{\n    public function commentable()\n    {\n        return $this-&gt;morphTo();\n    }\n}\n\nclass Poll extends Model\n{\n    public function comments()\n    {\n        return $this-&gt;morphMany(Comment::class, 'commentable');\n    }\n}\n\nclass Live extends Model\n{\n    public function comments()\n    {\n        return $this-&gt;morphMany(Comments::class, 'commentable');\n    }\n}<\/code><\/pre>\n<p>Maintenant, pour r\u00e9cup\u00e9rer les commentaires d&rsquo;un Live, nous pouvons simplement appeler la m\u00e9thode find avec l&rsquo;id, et nous avons maintenant acc\u00e8s \u00e0 la classe it\u00e9rable comments :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse <span id=\"urn:enhancement-f7bce609-d7b8-4109-89a8-c9b7966ce73a\" class=\"textannotation\">App<\/span>\\Models\\Live;\n\n$live = Live::find(1);\n\nforeach ($live-&gt;comments as $comment) { }\n\n\/\/ OR\n\nLive::find(1)-&gt;comments()-&gt;each(function($comment) { \/\/ });\nLive::find(1)-&gt;comments()-&gt;map(function($comment) { \/\/ });\nLive::find(1)-&gt;comments()-&gt;filter(function($comment) { \/\/ });\n\n\/\/ etc.<\/code><\/pre>\n<p>Et si nous avons le commentaire et que nous voulons savoir \u00e0 qui il appartient, nous acc\u00e9dons \u00e0 la m\u00e9thode commentable :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse <span id=\"urn:enhancement-b18bae1d-055b-4c48-8a21-4dc1f9e80699\" class=\"textannotation\">App<\/span>\\Models\\<span id=\"urn:enhancement-0bd992bf-be1a-4693-b465-0c421369c09d\" class=\"textannotation\">Comment<\/span>;\n\n$comment = Comment::find(10);\n$commentable = $comment-&gt;commentable;\n\n\/\/ commentable \u2013 type of Post, Video, Poll, Live<\/code><\/pre>\n<h2>Polymorphe un \u00e0 d&rsquo;autres<\/h2>\n<p>Dans de nombreuses applications qui \u00e9voluent, nous voulons un moyen facile d&rsquo;interagir avec les mod\u00e8les et entre eux. Nous pouvons vouloir conna\u00eetre le premier ou le dernier message d&rsquo;un utilisateur, ce qui peut \u00eatre fait avec une combinaison de m\u00e9thodes <strong>morphOne<\/strong> et <strong>ofMany <\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\npublic function latestPost()\n{\n    return $this-&gt;morphOne(Post::class, 'postable')-&gt;latestOfMany();\n}\n\npublic function oldestPost()\n{\n    return $this-&gt;morphOne(Post::class, 'postable')-&gt;oldestOfMany();\n}<\/code><\/pre>\n<p>Les m\u00e9thodes <strong>latestOfMany<\/strong> et <strong>oldestOfMany <\/strong>r\u00e9cup\u00e8rent le mod\u00e8le le plus r\u00e9cent ou le plus ancien en fonction de la cl\u00e9 primaire du mod\u00e8le, qui \u00e9tait la condition pour qu&rsquo;il puisse \u00eatre tri\u00e9.<\/p>\n<p>Dans certains cas, nous ne voulons pas trier par l&rsquo;ID, peut-\u00eatre avons-nous chang\u00e9 la date de publication de certains articles et nous les voulons dans cet ordre, pas par leur ID.<\/p>\n<p>Pour ce faire, vous pouvez passer deux param\u00e8tres \u00e0 la m\u00e9thode <strong>ofMany<\/strong>. Le premier param\u00e8tre est la <strong>cl\u00e9<\/strong> par laquelle nous voulons filtrer, et le second est la <strong>m\u00e9thode de tri <\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\npublic function latestPublishedPost()\n{\n    return $this-&gt;morphOne(Post::class, \"postable\")-&gt;ofMany(\"published_at\", \"max\");\n}<\/code><\/pre>\n<p>En gardant cela \u00e0 l&rsquo;esprit, il est possible de construire des relations plus avanc\u00e9es pour cela ! Imaginez le sc\u00e9nario suivant. On nous demande de g\u00e9n\u00e9rer une liste de tous les articles actuels dans l&rsquo;ordre dans lequel ils ont \u00e9t\u00e9 publi\u00e9s. Le probl\u00e8me se pose lorsque deux articles ont la m\u00eame valeur published_at et lorsque des articles sont programm\u00e9s pour \u00eatre publi\u00e9s dans le futur.<\/p>\n<p>Pour cela, nous pouvons passer l&rsquo;ordre dans lequel nous voulons que les filtres soient appliqu\u00e9s \u00e0 la m\u00e9thode <strong>ofMany<\/strong>. De cette mani\u00e8re, nous classons les articles par published_at, et s&rsquo;ils sont identiques, nous les classons par id. Deuxi\u00e8mement, nous pouvons appliquer une fonction de requ\u00eate \u00e0 la m\u00e9thode <strong>ofMany<\/strong> pour exclure tous les articles dont la publication est programm\u00e9e !<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\npublic function currentPosts()\n{\n    return $this-&gt;hasOne(Post::class)-&gt;ofMany([\n        'published_at' =&gt; 'max',\n        'id' =&gt; 'max',\n    ], function ($query) {\n        $query-&gt;where('published_at', '&lt;', now());\n    });\n}<\/code><\/pre>\n<h2>Polymorphe plusieurs \u00e0 plusieurs<\/h2>\n<p>Le many-to-many polymorphe est l\u00e9g\u00e8rement plus complexe que le normal. Une situation courante est celle o\u00f9 les balises s&rsquo;appliquent \u00e0 plusieurs actifs dans votre application. Par exemple, sur TikTok, nous avons des balises qui peuvent s&rsquo;appliquer aux vid\u00e9os, aux courts m\u00e9trages, aux histoires, etc.<\/p>\n<p>La m\u00e9thode polymorphe many-to-many nous permet d&rsquo;avoir une seule table de balises associ\u00e9es aux vid\u00e9os, aux courts-m\u00e9trages et aux histoires.<\/p>\n<p>La structure du tableau est simple :<\/p>\n<pre><code class=\"language-bash\">videos\n    id \u2013 integer\n    description \u2013 string\n\nstories \n    id \u2013 integer\n    description \u2013 string\n\ntaggables \n    tag_id \u2013 integer\n    taggable_id \u2013 integer\n    taggable_type \u2013 string<\/code><\/pre>\n<p>Les tables \u00e9tant pr\u00eates, nous pouvons cr\u00e9er le mod\u00e8le et utiliser la m\u00e9thode <strong>morphToMany<\/strong>. Cette m\u00e9thode accepte le nom de la classe du mod\u00e8le et le \u00ab nom de la relation \u00bb :<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-dea137ce-a90c-4962-8e43-2f3144f6b38a\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c5194399-a85e-44cd-9b35-36ed74440191\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-14169efa-b6fc-49c2-8f00-56e2e88c0f0b\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-e33c7e89-1623-4052-94d9-3864d5cb488c\" class=\"textannotation\">Model<\/span>;\n\nclass Video extends Model\n{\n    public function tags()\n    {\n        return $this-&gt;morphToMany(Tag::class, 'taggable');\n    }\n}<\/code><\/pre>\n<p>Gr\u00e2ce \u00e0 cela, nous pouvons facilement d\u00e9finir la relation inverse. Nous savons que pour chaque mod\u00e8le enfant, nous voulons appeler la m\u00e9thode <strong>morphedByMany<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-9a227131-6a81-4595-b064-f9d8ada3700b\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-f6859cdd-1eba-469f-80d5-ae83bf59f073\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-4e21a8bf-c147-404f-a077-b3a1b81dd922\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-abbcfba0-364c-4003-873e-a0cb07ee29a3\" class=\"textannotation\">Model<\/span>;\n\nclass Tag extends Model\n{\n    public function stories()\n    {\n        return $this-&gt;morphedByMany(Story::class, 'taggable');\n    }\n\n    public function videos()\n    {\n        return $this-&gt;morphedByMany(Video::class, 'taggable');\n    } \n}<\/code><\/pre>\n<p>Et maintenant, lorsque nous obtenons une balise, nous pouvons r\u00e9cup\u00e9rer toutes les vid\u00e9os et les histoires li\u00e9es \u00e0 cette balise !<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse <span id=\"urn:enhancement-429e290e-123f-4750-ba2e-773438a197ec\" class=\"textannotation\">App<\/span>\\<span id=\"urn:enhancement-5f837301-caca-4d01-bc1c-d683adf78ba9\" class=\"textannotation\">Model<\/span>\\<span id=\"urn:enhancement-3449aab5-5dbd-40e1-9538-afdcc4c87d89\" class=\"textannotation\">Tag<\/span>;\n\n$tag = Tag::find(10);\n$posts = $tag-&gt;stories;\n$videos = $tag-&gt;stories;<\/code><\/pre>\n<h2>Optimisez Eloquent pour plus de rapidit\u00e9<\/h2>\n<p>Lorsque vous travaillez avec l&rsquo;ORM Eloquent de Laravel, il est essentiel de comprendre comment optimiser les requ\u00eates de base de donn\u00e9es et minimiser le temps et la m\u00e9moire n\u00e9cessaires pour r\u00e9cup\u00e9rer les donn\u00e9es. L&rsquo;une des fa\u00e7ons d&rsquo;y parvenir est d&rsquo;<a href=\"https:\/\/kinsta.com\/fr\/blog\/laravel-caching\/\">impl\u00e9menter la mise en cache<\/a> dans votre application.<\/p>\n<p>Laravel fournit un syst\u00e8me de mise en cache flexible qui prend en charge diff\u00e9rents backends, tels que <a href=\"https:\/\/redis.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Redis<\/a>, <a href=\"https:\/\/memcached.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Memcached<\/a> et la <a href=\"https:\/\/www.ibm.com\/docs\/en\/zvm\/7.1?topic=reference-file-caching\" target=\"_blank\" rel=\"noopener noreferrer\">mise en cache bas\u00e9e sur les fichiers<\/a>. En mettant en cache les r\u00e9sultats des requ\u00eates Eloquent, vous pouvez r\u00e9duire le nombre de requ\u00eates de base de donn\u00e9es, ce qui rend votre application plus rapide et plus utile.<\/p>\n<p>En outre, vous pouvez utiliser le <a href=\"https:\/\/laravel.com\/docs\/10.x\/queries\" target=\"_blank\" rel=\"noopener noreferrer\">constructeur de requ\u00eates<\/a> de Laravel pour cr\u00e9er des requ\u00eates complexes suppl\u00e9mentaires, optimisant ainsi les performances de votre application.<\/p>\n<h2>En r\u00e9sum\u00e9<\/h2>\n<p>En conclusion, les relations Eloquent sont une fonctionnalit\u00e9 puissante de Laravel qui permet aux d\u00e9veloppeurs de travailler facilement avec des donn\u00e9es li\u00e9es. Qu&rsquo;il s&rsquo;agisse de relations un \u00e0 un ou plusieurs \u00e0 plusieurs, Eloquent fournit une syntaxe simple et intuitive pour d\u00e9finir et interroger ces relations.<\/p>\n<p>En tant que d\u00e9veloppeur Laravel, la ma\u00eetrise des relations Eloquent peut consid\u00e9rablement am\u00e9liorer votre flux de d\u00e9veloppement et rendre votre code plus efficace et plus lisible. Si vous souhaitez en savoir plus sur Laravel, Kinsta met \u00e0 votre disposition diverses ressources, notamment un <a href=\"https:\/\/kinsta.com\/fr\/blog\/tutoriels-laravel\/\">tutoriel<\/a> sur la prise en main de Laravel et un article sur les <a href=\"https:\/\/kinsta.com\/fr\/blog\/salaire-developpeur-laravel\/\">salaires des d\u00e9veloppeurs Laravel<\/a>.<\/p>\n<p>Kinsta propose des solutions d&rsquo;h\u00e9bergement g\u00e9r\u00e9es qui facilitent le <a href=\"https:\/\/sevalla.com\/application-hosting\/\">d\u00e9ploiement et la gestion des applications Laravel<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il y a souvent un moment dans la vie de tout d\u00e9veloppeur o\u00f9 vous devez interagir avec une base de donn\u00e9es. C&rsquo;est l\u00e0 qu&rsquo;Eloquent, le mappeur &#8230;<\/p>\n","protected":false},"author":267,"featured_media":69811,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[986,1020],"class_list":["post-69810","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-laravel","topic-outils-developpement-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Relations Laravel Eloquent : Un guide avanc\u00e9 - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Relations Laravel Eloquent : Un guide avanc\u00e9\" \/>\n<meta property=\"og:description\" content=\"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T17:13:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-04T09:44:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Coman Cosmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Relations Laravel Eloquent : Un guide avanc\u00e9\",\"datePublished\":\"2023-06-07T17:13:40+00:00\",\"dateModified\":\"2024-10-04T09:44:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\"},\"wordCount\":2776,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\",\"name\":\"Relations Laravel Eloquent : Un guide avanc\u00e9 - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg\",\"datePublished\":\"2023-06-07T17:13:40+00:00\",\"dateModified\":\"2024-10-04T09:44:17+00:00\",\"description\":\"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Relations Laravel Eloquent : Un guide avanc\u00e9\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/fr\/#website\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g\",\"caption\":\"Coman Cosmin\"},\"description\":\"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Relations Laravel Eloquent : Un guide avanc\u00e9 - Kinsta\u00ae","description":"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/","og_locale":"fr_FR","og_type":"article","og_title":"Relations Laravel Eloquent : Un guide avanc\u00e9","og_description":"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.","og_url":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2023-06-07T17:13:40+00:00","article_modified_time":"2024-10-04T09:44:17+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg","twitter_creator":"@kinsta_fr","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Coman Cosmin","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Relations Laravel Eloquent : Un guide avanc\u00e9","datePublished":"2023-06-07T17:13:40+00:00","dateModified":"2024-10-04T09:44:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/"},"wordCount":2776,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg","inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/","url":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/","name":"Relations Laravel Eloquent : Un guide avanc\u00e9 - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg","datePublished":"2023-06-07T17:13:40+00:00","dateModified":"2024-10-04T09:44:17+00:00","description":"Quand on travaille avec des tables dans une base de donn\u00e9es relationnelle, on peut caract\u00e9riser les relations comme des connexions entre les tables.","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/06\/laravel-relationships.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/relations-laravel-eloquent\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/fr\/sujets\/laravel\/"},{"@type":"ListItem","position":3,"name":"Relations Laravel Eloquent : Un guide avanc\u00e9"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/fr\/#website","url":"https:\/\/kinsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ede71ae86b38c64bcf00417fd17a686b?s=96&d=mm&r=g","caption":"Coman Cosmin"},"description":"Cosmin Coman is a technology writer and developer with over 3 years of experience. Apart from writing for Kinsta, he has assisted in research at nuclear physics facilities and universities. Tech-savvy and integrated into the community, he always comes up with innovative solutions.","url":"https:\/\/kinsta.com\/fr\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/69810","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=69810"}],"version-history":[{"count":8,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/69810\/revisions"}],"predecessor-version":[{"id":69938,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/69810\/revisions\/69938"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/translations\/nl"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/69810\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/69811"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=69810"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=69810"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=69810"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}