{"id":62603,"date":"2023-06-07T18:14:36","date_gmt":"2023-06-07T17:14:36","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=62603&#038;preview=true&#038;preview_id=62603"},"modified":"2023-08-29T06:24:36","modified_gmt":"2023-08-29T05:24:36","slug":"laravel-beziehungen","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/","title":{"rendered":"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene"},"content":{"rendered":"<p>Im Leben eines jeden Entwicklers gibt es oft einen Punkt, an dem du mit einer Datenbank interagieren musst. An dieser Stelle macht Eloquent, der objektrelationale Mapper (ORM) von Laravel, die Interaktion mit deinen Datenbanktabellen intuitiv und nat\u00fcrlich.<\/p>\n<p>Es ist wichtig, dass du als Profi die sechs wichtigsten Beziehungstypen kennst und verstehst, die wir hier besprechen werden.<\/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>Was sind Beziehungen in Eloquent?<\/h2>\n<p>Wenn du mit Tabellen in einer relationalen Datenbank arbeitest, k\u00f6nnen wir Beziehungen als Verbindungen zwischen Tabellen bezeichnen. Sie helfen dir, Daten m\u00fchelos zu organisieren und zu strukturieren und sorgen f\u00fcr eine bessere Lesbarkeit und Handhabung der Daten. In der Praxis gibt es drei Arten von Datenbankbeziehungen:<\/p>\n<ul>\n<li>one-to-one &#8211; Ein Datensatz in einer Tabelle ist mit einem, und nur einem, in einer anderen Tabelle verbunden. Zum Beispiel eine Person und eine Sozialversicherungsnummer.<\/li>\n<\/ul>\n<ul>\n<li>one-to-many &#8211; Ein Datensatz ist mit mehreren Datens\u00e4tzen in einer anderen Tabelle verkn\u00fcpft. Zum Beispiel ein Autor und seine Blogs.<\/li>\n<\/ul>\n<ul>\n<li>many-to-many &#8211; Mehrere Datens\u00e4tze in einer Tabelle werden mit mehreren Datens\u00e4tzen in einer anderen Tabelle verkn\u00fcpft. Zum Beispiel Sch\u00fcler und die Kurse, f\u00fcr die sie eingeschrieben sind.<\/li>\n<\/ul>\n<p>Laravel macht die Interaktion und Verwaltung von Datenbankbeziehungen mithilfe der objektorientierten Syntax in Eloquent ganz einfach.<\/p>\n<p>Zus\u00e4tzlich zu diesen Definitionen f\u00fchrt Laravel weitere Beziehungen ein, n\u00e4mlich:<\/p>\n<ul>\n<li>Has Many Through<\/li>\n<li>Polymorphe Beziehungen<\/li>\n<li>Many-to-many Polymorphic<\/li>\n<\/ul>\n<p>Nehmen wir zum Beispiel einen Laden, dessen Inventar eine Vielzahl von Artikeln enth\u00e4lt, jeder in seiner eigenen Kategorie. Deshalb ist es aus betriebswirtschaftlicher Sicht sinnvoll, die Datenbank in mehrere Tabellen aufzuteilen. Das bringt aber auch Probleme mit sich, denn du willst nicht jede einzelne Tabelle abfragen.<\/p>\n<p>Wir k\u00f6nnen in Laravel ganz einfach eine simple One-to-many-Beziehung erstellen, die uns dabei hilft. Wenn wir z. B. die Produkte abfragen wollen, k\u00f6nnen wir das mit dem Produktmodell tun.<\/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=\"Datenbankschema mit drei Tabellen und einer gemeinsamen Tabelle, die eine polymorphe Beziehung darstellt\" width=\"1158\" height=\"610\"><figcaption class=\"wp-caption-text\">Datenbankschema mit drei Tabellen und einer gemeinsamen Tabelle, die eine polymorphe Beziehung darstellt<\/figcaption><\/figure>\n<h2>One-to-one-Beziehung<\/h2>\n<p>Als erste grundlegende Beziehung, die Laravel anbietet, verbindet sie zwei Tabellen so, dass eine Zeile der ersten Tabelle mit nur einer Zeile der anderen Tabelle korreliert.<\/p>\n<p>Um dies in Aktion zu sehen, m\u00fcssen wir zwei Modelle mit ihrer eigenen Migration erstellen:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Tenant \nPhp artisan make:model Rent<\/code><\/pre>\n<p>An dieser Stelle haben wir zwei Modelle, das eine ist der Mieter und das andere seine Miete.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Da eloquent die Fremdschl\u00fcsselbeziehung anhand des Namens des \u00fcbergeordneten Modells (in diesem Fall Tenant) bestimmt, geht das Modell Rent davon aus, dass es einen Fremdschl\u00fcssel <strong>tenant_id<\/strong> gibt.<\/p>\n<p>Wir k\u00f6nnen ihn einfach \u00fcberschreiben, indem wir ein zus\u00e4tzliches Argument f\u00fcr die <strong>hasOne<\/strong>-Methode angeben:<\/p>\n<pre><code class=\"language-php\">return $this- &gt;hasOne(Rent::class, \"custom_key\");<\/code><\/pre>\n<p>Eloquent geht auch davon aus, dass es eine \u00dcbereinstimmung zwischen dem definierten Fremdschl\u00fcssel und dem Prim\u00e4rschl\u00fcssel des Elternmodells (Tenant) gibt. Standardm\u00e4\u00dfig wird die <strong>tenant_id<\/strong> mit dem <strong>id-Schl\u00fcssel<\/strong> des Tenant-Datensatzes abgeglichen. Wir k\u00f6nnen dies mit einem dritten Argument in der <strong>hasOne-Methode<\/strong> \u00fcberschreiben, so dass es mit einem anderen Schl\u00fcssel \u00fcbereinstimmt:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class, \"custom_key\", \"other_key\"); <\/code><\/pre>\n<p>Jetzt, da wir die One-to-one-Beziehung zwischen den Modellen definiert haben, k\u00f6nnen wir sie ganz einfach wie folgt verwenden:<\/p>\n<pre><code class=\"language-php\">$rent = Tenant::find(10)-&gt;rent;<\/code><\/pre>\n<p>Mit dieser Codezeile erhalten wir die Miete des Mieters mit der ID 10, falls sie existiert.<\/p>\n<h2>One-to-many-Beziehung<\/h2>\n<p>Wie bei der vorherigen Beziehung werden auch hier Beziehungen zwischen einem Elternmodell und mehreren Child-Modellen definiert. Es ist unwahrscheinlich, dass unser Mieter nur eine Mietzahlung hat, da es sich um eine wiederkehrende Zahlung handelt, also wird er mehrere Zahlungen haben.<\/p>\n<p>In diesem Fall hat unsere vorherige Beziehung einen Fehler, den wir beheben k\u00f6nnen:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Bevor wir die Methode zum Abrufen der Mieten aufrufen, sollten wir wissen, dass Beziehungen als Abfragebausteine dienen. Wir k\u00f6nnen also weitere Einschr\u00e4nkungen hinzuf\u00fcgen (z. B. Miete zwischen zwei Terminen, Mindestzahlung usw.) und sie verketten, um unser gew\u00fcnschtes Ergebnis zu erhalten:<\/p>\n<pre><code class=\"language-php\">$rents = Tenant::find(10)-&gt;rent()-&gt;where('payment', '&gt;', 500)-&gt;first();<\/code><\/pre>\n<p>Und wie bei der vorherigen Beziehung k\u00f6nnen wir die Fremd- und Lokalschl\u00fcssel \u00fcberschreiben, indem wir zus\u00e4tzliche Argumente \u00fcbergeben:<\/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>Jetzt haben wir alle Mieten eines Mieters, aber was machen wir, wenn wir die Miete kennen und herausfinden wollen, zu wem sie geh\u00f6rt? Dazu k\u00f6nnen wir die Eigenschaft <strong>belongsTo <\/strong>verwenden:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Jetzt k\u00f6nnen wir den Mieter ganz einfach ermitteln:<\/p>\n<pre><code class=\"language-php\">$tenant = Rent::find(1)-&gt;tenant;<\/code><\/pre>\n<p>Bei der <strong>belongsTo-Methode<\/strong> k\u00f6nnen wir auch die Fremd- und Lokalschl\u00fcssel \u00fcberschreiben, wie wir es zuvor getan haben.<\/p>\n<h2>Has-One-Of-Many-Beziehung<\/h2>\n<p>Da unser Tenant-Modell mit vielen Rent-Modellen verkn\u00fcpft sein kann, wollen wir ganz einfach das neueste oder \u00e4lteste Modell der Beziehungen abrufen.<\/p>\n<p>Eine bequeme M\u00f6glichkeit, dies zu tun, ist die Kombination der Methoden <strong>hasOne<\/strong> und <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>Standardm\u00e4\u00dfig erhalten wir die Daten auf der Grundlage des Prim\u00e4rschl\u00fcssels, der sortierbar ist, aber wir k\u00f6nnen unsere eigenen Filter f\u00fcr die <strong>ofMany<\/strong>-Methode erstellen:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class)-&gt;ofMany('price', 'min');<\/code><\/pre>\n<h2>HasOneThrough- und HasManyThrough-Beziehungen<\/h2>\n<p>Die <strong>-Through<\/strong>-Methoden legen nahe, dass unsere Modelle durch ein anderes Modell gehen m\u00fcssen, um eine Beziehung zum gew\u00fcnschten Modell herzustellen. Wir k\u00f6nnen zum Beispiel die Miete mit dem Vermieter verkn\u00fcpfen, aber die Miete muss erst den Mieter durchlaufen, um den Vermieter zu erreichen.<\/p>\n<p>Die Schl\u00fcssel der daf\u00fcr notwendigen Tabellen w\u00fcrden wie folgt aussehen:<\/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>Nachdem wir uns vorgestellt haben, wie unsere Tabellen aussehen, k\u00f6nnen wir die Modelle erstellen:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Das erste Argument der <strong>hasOneThrough<\/strong>-Methode ist das Modell, auf das du zugreifen willst, und das zweite Argument ist das Modell, durch das du gehen willst.<\/p>\n<p>Und genau wie zuvor kannst du die fremden und lokalen Schl\u00fcssel \u00fcberschreiben. Da wir nun zwei Modelle haben, m\u00fcssen wir in dieser Reihenfolge jeweils zwei davon \u00fcberschreiben:<\/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>Die &#8222;Has Many Through&#8220;-Beziehung in Laravel Eloquent ist n\u00fctzlich, wenn du auf Datens\u00e4tze in einer entfernten Tabelle \u00fcber eine Zwischentabelle zugreifen willst. Betrachten wir ein Beispiel mit drei Tabellen:<\/p>\n<ul>\n<li>land<\/li>\n<li>benutzer<\/li>\n<li>spiele<\/li>\n<\/ul>\n<p>Jedes Land hat viele Benutzer, und jeder Benutzer hat viele Spiele. Wir wollen alle Spiele, die zu einem Land geh\u00f6ren, \u00fcber die Benutzertabelle abrufen.<\/p>\n<p>Du w\u00fcrdest die Tabellen wie folgt definieren:<\/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>Jetzt solltest du das Eloquent-Modell f\u00fcr jede einzelne Tabelle definieren:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Jetzt k\u00f6nnen wir die Methode <strong>spiele() <\/strong>des L\u00e4ndermodells aufrufen, um alle Spiele zu erhalten, weil wir die Beziehung &#8222;Has many through&#8220; zwischen Land und Spiel \u00fcber das Benutzermodell hergestellt haben.<\/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>Many-To-Many-Beziehung<\/h2>\n<p>Die Many-To-Many-Beziehung ist komplizierter. Ein gutes Beispiel ist ein Mitarbeiter, der mehrere Rollen hat. Eine Rolle kann auch mehreren Mitarbeitern zugewiesen werden. Das ist die Grundlage der Many-to-Many-Beziehung.<\/p>\n<p>Daf\u00fcr brauchen wir die Tabellen <strong>employees<\/strong>, <strong>roles<\/strong> und <strong>role_employees <\/strong>.<\/p>\n<p>Unsere Datenbanktabellenstruktur wird wie folgt aussehen:<\/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>Wenn wir die Struktur der Beziehungstabellen kennen, k\u00f6nnen wir unser <strong>Mitarbeitermodell<\/strong> ganz einfach als <strong>&#8222;belongToMany&#8220;<\/strong> <strong>-Rollenmodell<\/strong> definieren.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Employee extends Model\n{\n    public function roles() \n    {\n        return $this- &gt;belongsToMany(Role::class);\n    }\n}<\/code><\/pre>\n<p>Sobald wir dies definiert haben, k\u00f6nnen wir auf alle Rollen eines Mitarbeiters zugreifen und sie sogar filtern:<\/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>Wie bei allen anderen Methoden k\u00f6nnen wir auch bei der <strong>belongsToMany<\/strong>-Methode die fremden und lokalen Schl\u00fcssel \u00fcberschreiben.<\/p>\n<p>Um die umgekehrte Beziehung der <strong>belongsToMany<\/strong>-Methode zu definieren, verwenden wir einfach dieselbe Methode, jetzt aber f\u00fcr die Child-Methode, mit dem Parent als Argument.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Role extends Model\n{\n    public function employees() \n    {\n        return $this-&gt;belongsToMany(Employee::class);\n    }\n}<\/code><\/pre>\n<h3>Verwendungen der Zwischentabelle<\/h3>\n<p>Wie wir vielleicht schon bemerkt haben, wird bei der Verwendung der Many-to-Many-Beziehung immer eine Zwischentabelle verwendet. In diesem Fall verwenden wir die Tabelle <strong>role_employees<\/strong>.<\/p>\n<p>Unsere Pivot-Tabelle enth\u00e4lt standardm\u00e4\u00dfig nur die Attribute id. Wenn wir andere Attribute w\u00fcnschen, m\u00fcssen wir sie wie folgt angeben:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withPivot(\"active\", \"created_at\");<\/code><\/pre>\n<p>Wenn wir den Pivot f\u00fcr die Zeitstempel abk\u00fcrzen wollen, k\u00f6nnen wir das tun:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withTimestamps();<\/code><\/pre>\n<p>Ein Trick ist, dass wir den Namen &#8222;Pivot&#8220; so anpassen k\u00f6nnen, dass er besser zu unserer Anwendung passt:<\/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>Das Filtern der Ergebnisse einer eloquenten Abfrage ist ein Muss f\u00fcr jeden Entwickler, der seine <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-leistung\/\">Laravel-Anwendungen optimieren<\/a> m\u00f6chte.<\/p>\n<p>Deshalb bietet Laravel mit den Pivots eine fantastische Funktion, mit der wir die Daten filtern k\u00f6nnen, die wir sammeln wollen. Anstatt also andere Funktionen wie <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-datenbank\/\">Datenbanktransaktionen<\/a> zu verwenden, um unsere Daten in St\u00fccken zu erhalten, k\u00f6nnen wir sie mit n\u00fctzlichen Methoden wie <strong>wherePivot, wherePivotIn, wherePivotNotIn, wherePivotBetween, wherePivotNotBetween, wherePivotNull, wherePivotNotNull<\/strong> filtern und sie bei der Definition von Beziehungen zwischen Tabellen verwenden!<\/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>Eine letzte erstaunliche Funktion ist, dass wir nach Pivots sortieren k\u00f6nnen:<\/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>Polymorphe Beziehungen<\/h2>\n<p>Das Wort Polymorph kommt aus dem Griechischen und bedeutet &#8222;viele Formen&#8220; Das bedeutet, dass ein Modell in unserer Anwendung viele Formen annehmen kann, d.h. es kann mehr als eine Assoziation haben. Stell dir vor, wir bauen eine Anwendung mit Blogs, Videos, Umfragen usw. Ein Nutzer kann f\u00fcr jedes dieser Elemente einen Kommentar erstellen. Daher k\u00f6nnte ein <strong>Kommentar-Modell<\/strong> zu den Modellen <strong>Blogs<\/strong>, <strong>Videos<\/strong> und <strong>Umfragen<\/strong> geh\u00f6ren.<\/p>\n<h2>Polymorphes One-to-one<\/h2>\n<p>Diese Art von Beziehung \u00e4hnelt einer normalen One-to-one-Beziehung. Der einzige Unterschied besteht darin, dass das Child-Modell mit einer einzigen Assoziation zu mehr als einer Art von Modell geh\u00f6ren kann.<\/p>\n<p>Zum Beispiel kann ein <strong>Mieter- <\/strong>und <strong>Vermieter<\/strong>-Modell eine polymorphe Beziehung zu einem <strong>WaterBill<\/strong>-Modell haben.<\/p>\n<p>Die Tabellenstruktur kann folgenderma\u00dfen aussehen:<\/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>Wir verwenden waterbillable_id f\u00fcr die ID des <strong>Vermieters <\/strong>oder <strong>Mieters <\/strong>, w\u00e4hrend die Spalte waterbillable_type den Klassennamen des \u00fcbergeordneten Modells enth\u00e4lt. Die Spalte type wird von eloquent verwendet, um herauszufinden, welches \u00fcbergeordnete Modell zur\u00fcckgegeben werden soll.<\/p>\n<p>Die Modelldefinition f\u00fcr eine solche Beziehung sieht wie folgt aus:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Wenn wir das alles eingerichtet haben, k\u00f6nnen wir auf die Daten sowohl des Vermieter- als auch des Mieter-Modells zugreifen:<\/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>Polymorphes One-to-many<\/h2>\n<p>Der einzige Unterschied besteht darin, dass das untergeordnete Modell \u00fcber eine einzige Assoziation zu mehr als einer Art von Modell geh\u00f6ren kann.<\/p>\n<p>In einer Anwendung wie Facebook k\u00f6nnen die Nutzer\/innen Beitr\u00e4ge, Videos, Umfragen, Live-\u00dcbertragungen usw. kommentieren. Mit einer polymorphen One-to-Many-Assoziation k\u00f6nnen wir eine einzige <strong>Kommentartabelle<\/strong> verwenden, um die Kommentare f\u00fcr alle Kategorien zu speichern, die wir haben. Unsere Tabellenstruktur w\u00fcrde etwa so aussehen:<\/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>Die commentable_id ist die ID des Datensatzes und die commentable_type ist der Klassentyp, damit eloquent wei\u00df, wonach es suchen muss. Die Struktur des Modells ist dem polymorphen One-to-Many-Modell sehr \u00e4hnlich:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Um die Kommentare eines Lives abzurufen, k\u00f6nnen wir einfach die Find-Methode mit der ID aufrufen und haben nun Zugriff auf die iterable Klasse comments:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse AppModelsLive;\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>Und wenn wir den Kommentar haben und herausfinden wollen, zu wem er geh\u00f6rt, rufen wir die commentable-Methode auf:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse AppModelsComment;\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>Polymorphes One-to-many<\/h2>\n<p>In vielen skalierbaren Anwendungen wollen wir eine einfache M\u00f6glichkeit haben, mit Modellen und zwischen ihnen zu interagieren. Wenn wir z. B. den ersten oder letzten Beitrag eines Nutzers wissen wollen, k\u00f6nnen wir dies mit einer Kombination aus den Methoden <strong>morphOne<\/strong> und <strong>ofMany<\/strong> erreichen:<\/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>Die Methoden <strong>latestOfMany<\/strong> und <strong>oldestOfMany <\/strong>ermitteln das neueste bzw. \u00e4lteste Modell auf der Grundlage des Prim\u00e4rschl\u00fcssels des Modells, der die Voraussetzung daf\u00fcr ist, dass es sortierbar ist.<\/p>\n<p>In manchen F\u00e4llen wollen wir nicht nach der ID sortieren, z. B. wenn wir das Ver\u00f6ffentlichungsdatum einiger Beitr\u00e4ge ge\u00e4ndert haben und sie in dieser Reihenfolge abrufen wollen, nicht nach ihrer ID.<\/p>\n<p>Dazu k\u00f6nnen wir der <strong>ofMany<\/strong>-Methode 2 Parameter \u00fcbergeben. Der erste Parameter ist der <strong>Schl\u00fcssel<\/strong>, nach dem wir filtern wollen, und der zweite ist die <strong>Sortiermethode<\/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>Mit diesem Wissen ist es m\u00f6glich, fortschrittlichere Beziehungen zu konstruieren! Stell dir vor, wir haben folgendes Szenario. Wir sollen eine Liste mit allen aktuellen Beitr\u00e4gen in der Reihenfolge erstellen, in der sie ver\u00f6ffentlicht worden sind. Das Problem entsteht, wenn wir 2 Beitr\u00e4ge mit demselben published_at-Wert haben und wenn die Beitr\u00e4ge in der Zukunft ver\u00f6ffentlicht werden sollen.<\/p>\n<p>Hierf\u00fcr k\u00f6nnen wir der <strong>ofMany<\/strong>-Methode die Reihenfolge \u00fcbergeben, in der die Filter angewendet werden sollen. Auf diese Weise ordnen wir nach published_at und, wenn sie gleich sind, nach id. Zweitens k\u00f6nnen wir eine Abfragefunktion auf die <strong>ofMany<\/strong>-Methode anwenden, um alle Beitr\u00e4ge auszuschlie\u00dfen, die f\u00fcr die Ver\u00f6ffentlichung vorgesehen sind!<\/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>Polymorphes Many-to-Many<\/h2>\n<p>Die polymorphe Many-to-Many-Methode ist etwas komplexer als die normale Methode. Eine h\u00e4ufige Situation ist, dass Tags f\u00fcr mehrere Assets in deiner Anwendung gelten. Bei TikTok haben wir zum Beispiel Tags, die auf Videos, Shorts, Stories usw. angewendet werden k\u00f6nnen.<\/p>\n<p>Die polymorphe Many-to-Many-Variante erm\u00f6glicht es uns, eine einzige Tabelle mit Tags zu haben, die den Videos, Shorts und Stories zugeordnet sind.<\/p>\n<p>Die Struktur der Tabelle ist einfach:<\/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>Wenn die Tabellen fertig sind, k\u00f6nnen wir das Modell erstellen und die Methode <strong>morphToMany<\/strong> verwenden. Diese Methode akzeptiert den Namen der Modellklasse und den &#8222;Beziehungsnamen&#8220;:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Damit k\u00f6nnen wir ganz einfach die umgekehrte Beziehung definieren. Wir wissen, dass wir f\u00fcr jedes untergeordnete Modell die Methode <strong>morphedByMany<\/strong> aufrufen wollen:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\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>Wenn wir nun einen Tag erhalten, k\u00f6nnen wir alle Videos und Geschichten abrufen, die mit diesem Tag zusammenh\u00e4ngen!<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse AppModelTag;\n\n$tag = Tag::find(10);\n$posts = $tag-&gt;stories;\n$videos = $tag-&gt;stories;<\/code><\/pre>\n<h2>Optimiere Eloquent f\u00fcr Geschwindigkeit<\/h2>\n<p>Wenn du mit dem Eloquent ORM von Laravel arbeitest, ist es wichtig zu wissen, wie du Datenbankabfragen optimierst und den Zeit- und Speicherbedarf f\u00fcr das Abrufen von Daten minimierst. Eine M\u00f6glichkeit, dies zu tun, ist die <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-caching\/\">Implementierung von Caching<\/a> in deiner Anwendung.<\/p>\n<p>Laravel bietet ein flexibles Caching-System, das verschiedene Backends unterst\u00fctzt, z. B. <a href=\"https:\/\/redis.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Redis<\/a>, <a href=\"https:\/\/memcached.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Memcached<\/a> und <a href=\"https:\/\/www.ibm.com\/docs\/en\/zvm\/7.1?topic=reference-file-caching\" target=\"_blank\" rel=\"noopener noreferrer\">dateibasiertes Caching<\/a>. Indem du die Ergebnisse von Eloquent-Abfragen zwischenspeicherst, kannst du die Anzahl der Datenbankabfragen reduzieren und deine Anwendung schneller und wertvoller machen.<\/p>\n<p>Au\u00dferdem kannst du den <a href=\"https:\/\/laravel.com\/docs\/10.x\/queries\" target=\"_blank\" rel=\"noopener noreferrer\">Query Builder<\/a> von Laravel nutzen, um zus\u00e4tzliche komplexe Abfragen zu erstellen und so die Leistung deiner Anwendung weiter zu optimieren.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Zusammenfassend l\u00e4sst sich sagen, dass Eloquent-Beziehungen eine leistungsstarke Funktion von Laravel sind, die es Entwicklern erm\u00f6glicht, einfach mit zusammenh\u00e4ngenden Daten zu arbeiten. Von One-to-one- bis zu Many-to-many-Beziehungen bietet Eloquent eine einfache und intuitive Syntax, um diese Beziehungen zu definieren und abzufragen.<\/p>\n<p>Wenn du als Laravel-Entwickler\/in die Eloquent-Beziehungen beherrschst, kann das deinen Entwicklungsworkflow erheblich verbessern und deinen Code effizienter und lesbarer machen. Wenn du mehr \u00fcber Laravel erfahren m\u00f6chtest, findest du bei Kinsta verschiedene Ressourcen, darunter ein <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-tutorial\/\">Tutorial<\/a> \u00fcber die ersten Schritte mit Laravel und einen Artikel \u00fcber die <a href=\"https:\/\/kinsta.com\/de\/blog\/laravel-entwickler-gehalt\/\">Geh\u00e4lter von Laravel-Entwicklern<\/a>.<\/p>\n<p>Kinsta bietet Managed-Hosting-L\u00f6sungen an, mit denen die <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Bereitstellung und Verwaltung von Laravel-Anwendungen<\/a> ein Kinderspiel ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Leben eines jeden Entwicklers gibt es oft einen Punkt, an dem du mit einer Datenbank interagieren musst. An dieser Stelle macht Eloquent, der objektrelationale Mapper &#8230;<\/p>\n","protected":false},"author":267,"featured_media":62604,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[958,991],"class_list":["post-62603","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-laravel","topic-web-entwicklungs-tools"],"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>Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.\" \/>\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\/de\/blog\/laravel-beziehungen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene\" \/>\n<meta property=\"og:description\" content=\"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T17:14:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-29T05:24:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/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=\"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene\",\"datePublished\":\"2023-06-07T17:14:36+00:00\",\"dateModified\":\"2023-08-29T05:24:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/\"},\"wordCount\":2297,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/\",\"name\":\"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg\",\"datePublished\":\"2023-06-07T17:14:36+00:00\",\"dateModified\":\"2023-08-29T05:24:36+00:00\",\"description\":\"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"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\/de\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene - Kinsta\u00ae","description":"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.","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\/de\/blog\/laravel-beziehungen\/","og_locale":"de_DE","og_type":"article","og_title":"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene","og_description":"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.","og_url":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2023-06-07T17:14:36+00:00","article_modified_time":"2023-08-29T05:24:36+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Coman Cosmin","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene","datePublished":"2023-06-07T17:14:36+00:00","dateModified":"2023-08-29T05:24:36+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/"},"wordCount":2297,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/","url":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/","name":"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg","datePublished":"2023-06-07T17:14:36+00:00","dateModified":"2023-08-29T05:24:36+00:00","description":"Wenn wir mit Tabellen in einer relationalen Datenbank arbeiten, k\u00f6nnen wir Beziehungen als Verbindungen zwischen den Tabellen bezeichnen.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/06\/laravel-relationships.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/laravel-beziehungen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/de\/thema\/laravel\/"},{"@type":"ListItem","position":3,"name":"Eloquent-Beziehungen in Laravel: Ein Leitfaden f\u00fcr Fortgeschrittene"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","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\/de\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/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\/de\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/62603","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=62603"}],"version-history":[{"count":6,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/62603\/revisions"}],"predecessor-version":[{"id":63162,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/62603\/revisions\/63162"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/translations\/nl"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/62603\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/62604"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=62603"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=62603"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=62603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}