{"id":69940,"date":"2023-06-07T17:38:28","date_gmt":"2023-06-07T16:38:28","guid":{"rendered":"https:\/\/kinqsta.com\/it\/?p=69940&#038;preview=true&#038;preview_id=69940"},"modified":"2023-06-13T09:19:54","modified_gmt":"2023-06-13T08:19:54","slug":"relazioni-laravel","status":"publish","type":"post","link":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/","title":{"rendered":"Le Relazioni Eloquent di Laravel: Guida avanzata"},"content":{"rendered":"<p>Nella vita di uno sviluppatore arriva spesso il momento in cui bisogna interagire con un database. \u00c8 qui che entra in scena Eloquent, il mappatore oggetto-relazionale (ORM) di Laravel che permette di interagire con le tabelle del database in modo intuitivo e naturale.<\/p>\n<p>\u00c8 fondamentale che un professionista riconosca e comprenda i sei tipi di relazione che esamineremo in questo articolo.<\/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>Cosa Sono le Relazioni in Eloquent?<\/h2>\n<p>Quando si lavora con le tabelle di un database relazionale, le relazioni possono essere definite come connessioni tra tabelle. Queste permettono di organizzare e strutturare i dati, migliorando la leggibilit\u00e0 e la gestione dei dati. In pratica esistono tre tipi di relazioni nei database:<\/p>\n<ul>\n<li>uno-a-uno &#8211; Un record di una tabella \u00e8 associato a uno, e uno solo, di un&#8217;altra tabella. Ad esempio, una persona e un numero di previdenza sociale.<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>uno-a-molti &#8211; Un record \u00e8 associato a pi\u00f9 record di un&#8217;altra tabella. Ad esempio, uno scrittore e il suo blog.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>molti-a-molti &#8211; Pi\u00f9 record di una tabella sono associati a pi\u00f9 record di un&#8217;altra tabella. Ad esempio, gli studenti e i corsi a cui sono iscritti.<\/li>\n<\/ul>\n<p>Con Laravel \u00e8 semplice interagire e gestire le relazioni tra i database utilizzando la sintassi orientata agli oggetti di Eloquent.<\/p>\n<p>Oltre a queste definizioni, Laravel introduce altre relazioni, ovvero:<\/p>\n<ul>\n<li>Has Many Through<\/li>\n<li>Relazioni polimorfiche<\/li>\n<li>Polimorfica molti-a-molti<\/li>\n<\/ul>\n<p>Prendiamo, ad esempio, un negozio il cui inventario contiene una variet\u00e0 di articoli, ognuno dei quali appartiene a una categoria specifica. Dividere il database in pi\u00f9 tabelle ha senso dal punto di vista commerciale. Ma questo comporta dei problemi, in quanto non si vuole interrogare ogni singola tabella.<\/p>\n<p>In Laravel possiamo facilmente creare una semplice relazione uno-a-molti. Ad esempio, quando dobbiamo interrogare i prodotti, possiamo farlo utilizzando il modello Product.<\/p>\n<figure style=\"width: 1158px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinqsta.com\/wp-content\/uploads\/2023\/05\/pasted-image-0-6.png\" alt=\"Schema di database con tre tabelle e una tabella congiunta che rappresenta una relazione polimorfica\" width=\"1158\" height=\"610\"><figcaption class=\"wp-caption-text\">Schema di database con tre tabelle e una tabella congiunta che rappresenta una relazione polimorfica<\/figcaption><\/figure>\n<h2>Relazione Uno-A-Uno<\/h2>\n<p>\u00c8 la prima relazione di base offerta da Laravel e associa due tabelle in modo tale che una riga della prima tabella sia correlata a una sola riga dell&#8217;altra tabella.<\/p>\n<p>Per vederla in azione, dobbiamo creare due modelli con la loro migrazione:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Tenant \nPhp artisan make:model Rent<\/code><\/pre>\n<p>A questo punto abbiamo due modelli: uno \u00e8 il Tenant (&#8220;inquilino&#8221;) e l&#8217;altro \u00e8 il Rent (&#8220;affitto&#8221;).<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-514762bd-817d-469b-bf8f-040dcdbfeae1\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-9e316764-0081-4428-b3e5-91a3b9624c90\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-0d6c1f6b-26d6-40aa-a578-73d3b3aa200d\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-be69fd7c-9b7e-4f8e-8d7b-30db7a6d446b\" 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>Poich\u00e9 eloquent determina la relazione della <em>foreign key<\/em> in base al nome del modello <em>parent<\/em> (Tenant in questo caso), il modello Rent presuppone l&#8217;esistenza di una <em>foreign key<\/em> <strong>tenant_id<\/strong>.<\/p>\n<p>Possiamo sovrascriverla aggiungendo un argomento al metodo <strong>hasOne<\/strong>:<\/p>\n<pre><code class=\"language-php\">return $this- &gt;hasOne(Rent::class, \"custom_key\");<\/code><\/pre>\n<p>Eloquent presuppone anche che ci sia una corrispondenza tra la chiave esterna definita e la chiave primaria del modello padre (Tenant). Di default, cercher\u00e0 di far corrispondere <strong>tenant_id<\/strong> con la chiave <strong>id<\/strong> del record Tenant. Possiamo sovrascrivere questo parametro con un terzo parametro nel metodo <strong>hasOne<\/strong>, in modo che corrisponda a un&#8217;altra chiave:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class, \"custom_key\", \"other_key\"); <\/code><\/pre>\n<p>Ora che abbiamo definito la relazione uno-a-uno tra i modelli, possiamo usarla in questo modo:<\/p>\n<pre><code class=\"language-php\">$rent = Tenant::find(10)-&gt;rent;<\/code><\/pre>\n<p>Con questa riga di codice otteniamo il Rent (&#8220;affitto&#8221;) del Tenant (&#8220;inquilino&#8221;) con l&#8217;id 10, se esiste.<\/p>\n<h2>Relazione Uno-A-Molti<\/h2>\n<p>Come la relazione precedente, anche questa definir\u00e0 le relazioni tra un modello monoparentale e pi\u00f9 modelli figli. \u00c8 improbabile che il nostro Tenant abbia una sola bolletta dell&#8217;affitto perch\u00e9 si tratta di un pagamento ricorrente, quindi avr\u00e0 pi\u00f9 pagamenti.<\/p>\n<p>In questo caso, la relazione precedente presenta dei difetti che possiamo correggere:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-8cccd105-8117-4357-911a-34424d70d491\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c57ae983-a129-425a-9ac2-e80844545df8\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-2dd5c4e2-c4f3-4c52-91ac-1eb92f117e7a\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7094f316-a95a-4e7a-b7e9-cd382c899ea7\" 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>Prima di invocare il metodo per ottenere gli affitti, \u00e8 bene sapere che le relazioni servono a costruire le query, quindi possiamo aggiungere altri vincoli (come le date degli affitti, i pagamenti minimi, ecc.) e concatenarli per ottenere il risultato desiderato:<\/p>\n<pre><code class=\"language-php\">$rents = Tenant::find(10)-&gt;rent()-&gt;where('payment', '&gt;', 500)-&gt;first();<\/code><\/pre>\n<p>E come per la relazione precedente, possiamo sovrascrivere le chiavi esterne e locali inserendo altri argomenti:<\/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>Ora abbiamo tutti gli affitti di un Tenant, ma cosa facciamo se conosciamo l&#8217;affitto e vogliamo capire a chi appartiene? Possiamo utilizzare la propriet\u00e0 <strong>belongsTo<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-8cccd105-8117-4357-911a-34424d70d491\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c57ae983-a129-425a-9ac2-e80844545df8\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-2dd5c4e2-c4f3-4c52-91ac-1eb92f117e7a\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7094f316-a95a-4e7a-b7e9-cd382c899ea7\" 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>E ora possiamo trovare facilmente il Tenant:<\/p>\n<pre><code class=\"language-php\">$tenant = Rent::find(1)-&gt;tenant;<\/code><\/pre>\n<p>Per il metodo <strong>belongsTo<\/strong>, possiamo anche sovrascrivere le chiavi esterne e locali come abbiamo fatto in precedenza.<\/p>\n<h2>Relazione Has-One-Of-Many<\/h2>\n<p>Dato che il nostro modello di Tenant pu\u00f2 essere associato a molti modelli di Rent, vogliamo recuperare il modello pi\u00f9 recente o pi\u00f9 vecchio delle relazioni.<\/p>\n<p>Un modo comodo per farlo \u00e8 combinare i metodi <strong>hasOne<\/strong> e <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>Di default, otteniamo i dati in base alla chiave primaria, che \u00e8 ordinabile, ma possiamo creare i nostri filtri per il metodo <strong>ofMany<\/strong>:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class)-&gt;ofMany('price', 'min');<\/code><\/pre>\n<h2>Relazioni HasOneThrough e HasManyThrough<\/h2>\n<p>COn i metodi <strong>-Through<\/strong>, i nostri modelli dovranno passare attraverso un altro modello per stabilire una relazione con il modello desiderato. Ad esempio, possiamo associare l&#8217;Affitto al Locatore, ma l&#8217;Affitto deve prima passare attraverso l&#8217;Tenantper raggi ungere il Locatore.<\/p>\n<p>Le chiavi delle tabelle necessarie a questo scopo sarebbero le seguenti:<\/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>Dopo aver visualizzato l&#8217;aspetto delle nostre tabelle, possiamo creare i modelli:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-8cccd105-8117-4357-911a-34424d70d491\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c57ae983-a129-425a-9ac2-e80844545df8\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-2dd5c4e2-c4f3-4c52-91ac-1eb92f117e7a\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7094f316-a95a-4e7a-b7e9-cd382c899ea7\" 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>Il primo argomento del metodo <strong>hasOneThrough<\/strong> \u00e8 il modello a cui accedere e il secondo argomento \u00e8 il modello da attraversare.<\/p>\n<p>E, proprio come prima, \u00e8 possibile sovrascrivere le chiavi esterne e locali. Ora che abbiamo due modelli, ne abbiamo due di ciascuno da sovrascrivere in questo ordine:<\/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>Allo stesso modo, la relazione &#8220;Has Many Through&#8221; di Laravel Eloquent \u00e8 utile per accedere ai record di una tabella lontana attraverso una tabella intermedia. Consideriamo un esempio con tre tabelle:<\/p>\n<ul>\n<li>paese<\/li>\n<li>utenti<\/li>\n<li>giochi<\/li>\n<\/ul>\n<p>Ogni Paese ha molti utenti e ogni utente ha molti giochi. Vogliamo recuperare tutti i giochi appartenenti a un Paese attraverso la tabella Utenti.<\/p>\n<p>Bisognerebbe definire le tabelle in questo modo:<\/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>Ora bisogna definire il modello Eloquent per ogni singola tabella:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-514762bd-817d-469b-bf8f-040dcdbfeae1\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-9e316764-0081-4428-b3e5-91a3b9624c90\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-0d6c1f6b-26d6-40aa-a578-73d3b3aa200d\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-be69fd7c-9b7e-4f8e-8d7b-30db7a6d446b\" 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-8cccd105-8117-4357-911a-34424d70d491\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c57ae983-a129-425a-9ac2-e80844545df8\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-2dd5c4e2-c4f3-4c52-91ac-1eb92f117e7a\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7094f316-a95a-4e7a-b7e9-cd382c899ea7\" 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-8cccd105-8117-4357-911a-34424d70d491\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c57ae983-a129-425a-9ac2-e80844545df8\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-2dd5c4e2-c4f3-4c52-91ac-1eb92f117e7a\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7094f316-a95a-4e7a-b7e9-cd382c899ea7\" 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>Ora possiamo invocare il metodo <strong>games()<\/strong> del modello Country per ottenere tutti i giochi perch\u00e9 abbiamo stabilito la relazione &#8220;Has Many Through&#8221; tra Country e Game attraverso il modello User.<\/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>Relazione Molti-A-Molti<\/h2>\n<p>La relazione molti-a-molti \u00e8 pi\u00f9 complicata. Un buon esempio \u00e8 quello di un dipendente che ha pi\u00f9 ruoli. Un ruolo pu\u00f2 anche essere assegnato a pi\u00f9 dipendenti. Questa \u00e8 la base della relazione molti-a-molti.<\/p>\n<p>Per questo, dobbiamo avere le tabelle <strong>employees<\/strong>, <strong>roles<\/strong> e <strong>role_employees<\/strong>.<\/p>\n<p>La struttura delle tabelle del nostro database sar\u00e0 la seguente:<\/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>Conoscendo la struttura delle tabelle della relazione, possiamo facilmente definire il nostro <strong>Modello Employee<\/strong> in modo che appartenga al modello <strong>belongsToMany Role<\/strong>.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-8cccd105-8117-4357-911a-34424d70d491\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-c57ae983-a129-425a-9ac2-e80844545df8\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-2dd5c4e2-c4f3-4c52-91ac-1eb92f117e7a\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7094f316-a95a-4e7a-b7e9-cd382c899ea7\" 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>Una volta definito questo, possiamo accedere a tutti i ruoli di un dipendente ed anche filtrarli:<\/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>Come tutti gli altri metodi, possiamo sovrascrivere le chiavi esterne e locali del metodo <strong>belongsToMany<\/strong>.<\/p>\n<p>Per definire la relazione inversa di <strong>belongsToMany<\/strong> \u00e8 sufficiente utilizzare lo stesso metodo, ma con il metodo figlio, e il genitore come argomento.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-7b322af1-f0c7-4781-a8fb-5a94b56b41a8\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-cad5f24f-d496-4210-b27a-1ef05656beea\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-38abd205-cfee-49a8-9f59-960996aa9422\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7ab13dbe-cd6d-48d7-9a39-b878262c3cdc\" 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>Utilizzi della Tabella Intermedia<\/h3>\n<p>Come abbiamo notato, quando utilizziamo la relazione molti-a-molti, dobbiamo sempre avere una tabella intermedia. In questo caso, utilizziamo la tabella <strong>role_employees<\/strong>.<\/p>\n<p>Di default, la nostra tabella pivot conterr\u00e0 solo gli attributi id. Se vogliamo altri attributi, dobbiamo specificarli in questo modo:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withPivot(\"active\", \"created_at\");<\/code><\/pre>\n<p>Se vogliamo ridurre la pivot per i timestamp, possiamo farlo cos\u00ec:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withTimestamps();<\/code><\/pre>\n<p>Possiamo personalizzare il nome &#8216;pivot&#8217; con qualsiasi cosa che si adatti meglio alla nostra applicazione:<\/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>Filtrare i risultati di una query Eloquent \u00e8 un&#8217;operazione indispensabile per tutti gli sviluppatori che vogliono migliorare e <a href=\"https:\/\/kinqsta.com\/it\/blog\/prestazioni-laravel\/\">ottimizzare le proprie applicazioni Laravel<\/a>.<\/p>\n<p>Per questo Laravel offre una fantastica funzione pivot che pu\u00f2 essere utilizzata per filtrare i dati che vogliamo raccogliere. Cos\u00ec, invece di utilizzare altre funzioni come le <a href=\"https:\/\/kinqsta.com\/it\/blog\/database-laravel\/\">transazioni del database<\/a> per ottenere i nostri dati in frammenti, possiamo filtrarli con metodi come <strong>wherePivot, wherePivotIn, wherePivotNotIn, wherePivotBetween, wherePivotNotBetween, wherePivotNull, wherePivotNotNull<\/strong> e possiamo usarli quando definiamo le relazioni tra le tabelle!<\/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>Un&#8217;ultima sorprendente caratteristica \u00e8 la possibilit\u00e0 di ordinare i pivot:<\/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>Relazioni Polimorfiche<\/h2>\n<p>La parola Polimorfico (o polimorfo) deriva dal greco e significa &#8220;molte forme&#8221;. Un modello nella nostra applicazione pu\u00f2 assumere molte forme, ovvero pu\u00f2 avere pi\u00f9 di un&#8217;associazione. Immaginiamo di costruire un&#8217;applicazione con blog, video, sondaggi, ecc. Un utente pu\u00f2 creare un commento per ognuno di questi. Pertanto, un <strong>modello Comment<\/strong> potrebbe appartenere ai modelli <strong>Blog<\/strong>, <strong>Video<\/strong> e <strong>Sondaggi<\/strong>.<\/p>\n<h2>Polimorfica Uno a Uno<\/h2>\n<p>Questo tipo di relazione \u00e8 simile a una relazione standard uno-a-uno. L&#8217;unica differenza \u00e8 che il modello figlio pu\u00f2 appartenere a pi\u00f9 di un tipo di modello con una singola associazione.<\/p>\n<p>Ad esempio, un modello <strong>Tenant<\/strong> e <strong>Landlord<\/strong> pu\u00f2 condividere una relazione polimorfa con un modello <strong>WaterBill<\/strong>.<\/p>\n<p>La struttura della tabella pu\u00f2 essere la seguente:<\/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>Utilizziamo waterbillable_id per l&#8217;id del <strong>landlord<\/strong> o del <strong>tenant<\/strong>, mentre waterbillable_type contiene il nome della classe del modello genitore. La colonna type viene utilizzata da Eloquent per capire quale modello genitore restituire.<\/p>\n<p>La definizione del modello per questa relazione sar\u00e0 la seguente:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-7b322af1-f0c7-4781-a8fb-5a94b56b41a8\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-cad5f24f-d496-4210-b27a-1ef05656beea\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-38abd205-cfee-49a8-9f59-960996aa9422\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-7ab13dbe-cd6d-48d7-9a39-b878262c3cdc\" 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>Una volta che tutto questo \u00e8 stato messo a punto, possiamo accedere ai dati di entrambi i modelli Landlord e Tenant:<\/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>Una Relazione Polimorfica Uno A Molti<\/h2>\n<p>\u00c8 simile a una normale relazione uno-a-molti; la differenza principale \u00e8 che il modello figlio pu\u00f2 appartenere a pi\u00f9 di un tipo di modello, utilizzando una singola associazione.<\/p>\n<p>In un&#8217;applicazione come Facebook, gli utenti possono commentare post, video, sondaggi, dirette, ecc. Con un&#8217;associazione polimorfa uno a molti, possiamo utilizzare un&#8217;unica tabella <strong>comments<\/strong> per memorizzare i commenti di tutte le categorie. La struttura delle nostre tabelle sarebbe simile a questa:<\/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>Il commentable_id \u00e8 l&#8217;id del record e il commentable_type \u00e8 il tipo di classe, in modo che eloquent sappia cosa cercare. Per quanto riguarda la struttura del modello, \u00e8 molto simile a quella polimorfica uno-a-molti:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-67b56b05-66df-4864-9d52-6995c2aeb029\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-3aed21c3-e59f-4a6f-bd30-66a54a3b7d9f\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-510897e0-a3b0-4f1d-a154-6c626b3ad6a4\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-d48296fc-5a6b-4e13-a0c1-46ee0d9047ab\" 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>Ora, per recuperare i commenti di un Live, possiamo semplicemente richiamare il metodo find con l&#8217;id e ora abbiamo accesso alla classe iterabile dei commenti:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse <span id=\"urn:enhancement-cfa7b318-6036-4529-bd10-ea688b2bec13\" 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>Se abbiamo un commento e vogliamo scoprire a chi appartiene, possiamo accedere al metodo commentable:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse <span id=\"urn:enhancement-916274e4-c552-4ffc-8984-52e903f7aff7\" class=\"textannotation\">App<\/span>\\Models\\<span id=\"urn:enhancement-c9db857a-001e-49b4-99de-2276edd6f1a0\" 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>Polimorfica Uno A Molti<\/h2>\n<p>In molte applicazioni che scalano, vogliamo un modo semplice per interagire con i modelli e tra di essi. Potremmo voler conoscere il primo o l&#8217;ultimo post di un utente, il che pu\u00f2 essere fatto con una combinazione di metodi <strong>morphOne<\/strong> e <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>I metodi <strong>latestOfMany<\/strong> e <strong>oldestOfMany<\/strong> recuperano il modello pi\u00f9 recente o pi\u00f9 vecchio in base alla chiave primaria del modello, ovvero alla condizione che sia ordinabile.<\/p>\n<p>In alcuni casi, non vogliamo ordinare in base all&#8217;ID, magari abbiamo cambiato la data di pubblicazione di alcuni post e li vogliamo in quell&#8217;ordine, non in base al loro id.<\/p>\n<p>Per questo \u00e8 possibile passare due parametri al metodo <strong>ofMany<\/strong>. Il primo parametro \u00e8 la <strong>chiave<\/strong> per cui vogliamo filtrare e il secondo \u00e8 il <strong>metodo di ordinamento<\/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>Tenendo conto di questo, \u00e8 possibile costruire relazioni pi\u00f9 avanzate! Immaginiamo di avere questo scenario. Ci viene chiesto di generare un elenco di tutti i post attuali nell&#8217;ordine in cui sono stati pubblicati. Il problema sorge quando abbiamo due post con lo stesso valore di published_at e quando i post sono programmati per essere pubblicati in futuro.<\/p>\n<p>Per farlo, possiamo passare l&#8217;ordine in cui vogliamo che i filtri siano applicati al metodo <strong>ofMany<\/strong>. In questo modo ordiniamo per published_at e, se sono uguali, ordiniamo per id. In secondo luogo, possiamo applicare una funzione di query al metodo <strong>ofMany<\/strong> per escludere tutti i post di cui \u00e8 prevista la pubblicazione!<\/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>Polimorfica Molti A Molti<\/h2>\n<p>Il metodo polimorfico molti-a-molti \u00e8 leggermente pi\u00f9 complesso di quello normale. Una situazione frequente \u00e8 quella in cui i tag si applicano a pi\u00f9 risorse nella stessa applicazione. Ad esempio, su TikTok abbiamo tag che possono essere applicati a video, corti, storie, ecc.<\/p>\n<p>Il metodo polimorfico molti-a-molti ci permette di avere un&#8217;unica tabella di tag associati ai Video, ai Corti e alle Storie.<\/p>\n<p>La struttura della tabella \u00e8 semplice:<\/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>Con le tabelle pronte, possiamo creare il modello e utilizzare il metodo <strong>morphToMany<\/strong>. Questo metodo accetta il nome della classe del modello e il &#8220;nome della relazione&#8221;:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-c1f9c5d7-181c-4b1c-84aa-7fb8241b1b25\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-a42534da-0c0b-4631-93f9-7430e71c6144\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e9645e38-89eb-4d50-bf09-6dc6809b40e6\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-1b1f3c87-1ea7-4507-bd32-28616242b8fb\" 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>Con questo metodo possiamo facilmente definire la relazione inversa. Sappiamo che per ogni modello figlio vogliamo invocare il metodo <strong>morphedByMany<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n<span id=\"urn:enhancement-c1f9c5d7-181c-4b1c-84aa-7fb8241b1b25\" class=\"textannotation\">namespace<\/span> <span id=\"urn:enhancement-a42534da-0c0b-4631-93f9-7430e71c6144\" class=\"textannotation\">App<\/span>\\Models;\nuse Illuminate\\<span id=\"urn:enhancement-e9645e38-89eb-4d50-bf09-6dc6809b40e6\" class=\"textannotation\">Database<\/span>\\Eloquent\\<span id=\"urn:enhancement-1b1f3c87-1ea7-4507-bd32-28616242b8fb\" 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>E ora, quando otteniamo un Tag, possiamo recuperare tutti i video e le storie correlate a quel tag!<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse <span id=\"urn:enhancement-1062d0aa-4981-44f8-9668-d7f071435084\" class=\"textannotation\">App<\/span>\\<span id=\"urn:enhancement-6371a792-fb37-414f-830c-c978707117b3\" class=\"textannotation\">Model<\/span>\\<span id=\"urn:enhancement-3454afad-b8c2-44dd-8e1c-2579a5a7ae3e\" class=\"textannotation\">Tag<\/span>;\n\n$tag = Tag::find(10);\n$posts = $tag-&gt;stories;\n$videos = $tag-&gt;stories;<\/code><\/pre>\n<h2>Ottimizzare la Velocit\u00e0 di Eloquent<\/h2>\n<p>Quando si lavora con l&#8217;ORM Eloquent di Laravel, \u00e8 importante capire come ottimizzare le query sul database e ridurre al minimo il tempo e la memoria necessari per recuperare i dati. Uno dei modi per farlo \u00e8 <a href=\"https:\/\/kinqsta.com\/it\/blog\/caching-laravel\/\">implementare la cache<\/a> nell&#8217;applicazione.<\/p>\n<p>Laravel offre un sistema di caching flessibile che supporta diversi backend, come <a href=\"https:\/\/redis.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Redis<\/a>, <a href=\"https:\/\/memcached.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Memcached<\/a> e la <a href=\"https:\/\/www.ibm.com\/docs\/en\/zvm\/7.1?topic=reference-file-caching\" target=\"_blank\" rel=\"noopener noreferrer\">cache basata su file<\/a>. Mettendo in cache i risultati delle query di Eloquent, \u00e8 possibile ridurre il numero di interrogazioni al database, il che permette di rendere un&#8217;applicazione pi\u00f9 veloce e ne aumenta il valore.<\/p>\n<p>Inoltre, si pu\u00f2 utilizzare il <a href=\"https:\/\/laravel.com\/docs\/10.x\/queries\" target=\"_blank\" rel=\"noopener noreferrer\">query builder<\/a> di Laravel per creare altre query complesse, ottimizzando ancora di pi\u00f9 le prestazioni dell&#8217;applicazione.<\/p>\n<h2>Riepilogo<\/h2>\n<p>In conclusione, le relazioni Eloquent di Laravel permettono agli sviluppatori di lavorare facilmente con dati correlati. Dalle relazioni uno-a-uno a quelle molti-a-molti, Eloquent fornisce una sintassi semplice e intuitiva per definire e interrogare queste relazioni.<\/p>\n<p>La padronanza delle relazioni di Eloquent pu\u00f2 migliorare notevolmente il flusso di lavoro di uno sviluppatore e rendere il codice pi\u00f9 efficiente e leggibile. Se volete saperne di pi\u00f9 su Laravel, Kinsta offre diverse risorse, tra cui un <a href=\"https:\/\/kinqsta.com\/it\/blog\/tutorial-laravel\/\">tutorial<\/a> per iniziare a lavorare con Laravel e un articolo sugli <a href=\"https:\/\/kinqsta.com\/it\/blog\/stipendio-sviluppatore-laravel\/\">stipendi degli sviluppatori Laravel<\/a>.<\/p>\n<p>Kinsta offre soluzioni di hosting gestito che rendono la <a href=\"https:\/\/sevalla.com\/application-hosting\/\">distribuzione e la gestione delle applicazioni Laravel<\/a> un gioco da ragazzi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nella vita di uno sviluppatore arriva spesso il momento in cui bisogna interagire con un database. \u00c8 qui che entra in scena Eloquent, il mappatore oggetto-relazionale &#8230;<\/p>\n","protected":false},"author":267,"featured_media":69941,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26020],"class_list":["post-69940","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-laravel"],"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>Le Relazioni Eloquent di Laravel: Guida avanzata - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Le Relazioni Eloquent di Laravel: Guida avanzata\" \/>\n<meta property=\"og:description\" content=\"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T16:38:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-13T08:19:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/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=\"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinqsta.com\/it\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Le Relazioni Eloquent di Laravel: Guida avanzata\",\"datePublished\":\"2023-06-07T16:38:28+00:00\",\"dateModified\":\"2023-06-13T08:19:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\"},\"wordCount\":2178,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\",\"url\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\",\"name\":\"Le Relazioni Eloquent di Laravel: Guida avanzata - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg\",\"datePublished\":\"2023-06-07T16:38:28+00:00\",\"dateModified\":\"2023-06-13T08:19:54+00:00\",\"description\":\"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage\",\"url\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg\",\"contentUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinqsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinqsta.com\/it\/argomenti\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Le Relazioni Eloquent di Laravel: Guida avanzata\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinqsta.com\/it\/#website\",\"url\":\"https:\/\/kinqsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinqsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinqsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinqsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"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:\/\/kinqsta.com\/it\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinqsta.com\/it\/#\/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:\/\/kinqsta.com\/it\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Le Relazioni Eloquent di Laravel: Guida avanzata - Kinsta\u00ae","description":"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.","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:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/","og_locale":"it_IT","og_type":"article","og_title":"Le Relazioni Eloquent di Laravel: Guida avanzata","og_description":"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.","og_url":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2023-06-07T16:38:28+00:00","article_modified_time":"2023-06-13T08:19:54+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.","twitter_image":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Coman Cosmin","Tempo di lettura stimato":"14 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#article","isPartOf":{"@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinqsta.com\/it\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Le Relazioni Eloquent di Laravel: Guida avanzata","datePublished":"2023-06-07T16:38:28+00:00","dateModified":"2023-06-13T08:19:54+00:00","mainEntityOfPage":{"@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/"},"wordCount":2178,"commentCount":0,"publisher":{"@id":"https:\/\/kinqsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/","url":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/","name":"Le Relazioni Eloquent di Laravel: Guida avanzata - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinqsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage"},"image":{"@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg","datePublished":"2023-06-07T16:38:28+00:00","dateModified":"2023-06-13T08:19:54+00:00","description":"Con le tabelle di un database relazionale, si possono definire le relazioni come connessioni tra le tabelle.","breadcrumb":{"@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#primaryimage","url":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg","contentUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/laravel-relationships.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinqsta.com\/it\/blog\/relazioni-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinqsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinqsta.com\/it\/argomenti\/laravel\/"},{"@type":"ListItem","position":3,"name":"Le Relazioni Eloquent di Laravel: Guida avanzata"}]},{"@type":"WebSite","@id":"https:\/\/kinqsta.com\/it\/#website","url":"https:\/\/kinqsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinqsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinqsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinqsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinqsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinqsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinqsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","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:\/\/kinqsta.com\/it\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinqsta.com\/it\/#\/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:\/\/kinqsta.com\/it\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts\/69940","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/comments?post=69940"}],"version-history":[{"count":12,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts\/69940\/revisions"}],"predecessor-version":[{"id":70077,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/posts\/69940\/revisions\/70077"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/translations\/nl"},{"href":"https:\/\/kinqsta.com\/it\/wp-json\/kinsta\/v1\/posts\/69940\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/media\/69941"}],"wp:attachment":[{"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/media?parent=69940"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/tags?post=69940"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinqsta.com\/it\/wp-json\/wp\/v2\/topic?post=69940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}