{"id":59995,"date":"2023-10-07T14:12:06","date_gmt":"2023-10-07T17:12:06","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=59995&#038;preview=true&#038;preview_id=59995"},"modified":"2023-10-25T12:36:54","modified_gmt":"2023-10-25T15:36:54","slug":"relacoes-eloquent-laravel","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/","title":{"rendered":"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado"},"content":{"rendered":"<p>Frequentemente, em algum ponto da carreira de qualquer desenvolvedor, \u00e9 necess\u00e1rio interagir com um banco de dados. \u00c9 nesse momento que o Eloquent, o mapeador objeto-relacional (ORM) do Laravel, torna o processo de intera\u00e7\u00e3o com suas tabelas do banco de dados intuitivo e natural.<\/p>\n<p>\u00c9 crucial que, como profissional, voc\u00ea reconhe\u00e7a e compreenda os seis principais tipos de relacionamentos, os quais abordaremos e revisaremos.<\/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>O que s\u00e3o relacionamentos no Eloquent?<\/h2>\n<p>Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar os relacionamentos como conex\u00f5es entre tabelas. Isso ajuda voc\u00ea a organizar e estruturar os dados sem esfor\u00e7o, permitindo maior legibilidade e manuseio dos dados. Na pr\u00e1tica, existem tr\u00eas tipos de relacionamentos do banco de dados:<\/p>\n<ul>\n<li>um-para-um &#8211; Um registro em uma tabela est\u00e1 associado a um, e somente um, em outra tabela. Por exemplo, uma pessoa e um n\u00famero de seguro social.<\/li>\n<\/ul>\n<ul>\n<li>um-para-muitos &#8211; Um registro est\u00e1 associado a v\u00e1rios registros em outra tabela. Por exemplo, um escritor e seus blogs.<\/li>\n<\/ul>\n<ul>\n<li>muitos-para-muitos &#8211; V\u00e1rios registros em uma tabela s\u00e3o associados a v\u00e1rios registros em outra tabela. Por exemplo, alunos e os cursos em que est\u00e3o matriculados.<\/li>\n<\/ul>\n<p>Com o Laravel, voc\u00ea pode interagir e gerenciar facilmente os relacionamentos do banco de dados usando a sintaxe orientada a objetos no Eloquent.<\/p>\n<p>Al\u00e9m dessas defini\u00e7\u00f5es, o Laravel introduz outros tipos de relacionamentos, como:<\/p>\n<ul>\n<li>Has Many Through (Tem Muitos Atrav\u00e9s)<\/li>\n<li>Polymorphic Relations (Rela\u00e7\u00f5es Polim\u00f3rficas)<\/li>\n<li>Many-to-many Polymorphic (Muitos-para-muitos Polim\u00f3rficos)<\/li>\n<\/ul>\n<p>Por exemplo, considere uma loja cujo estoque cont\u00e9m uma variedade de artigos, cada um em sua pr\u00f3pria categoria. Portanto, dividir o banco de dados em v\u00e1rias tabelas faz sentido do ponto de vista comercial. No entanto, isso vem com seus pr\u00f3prios desafios, j\u00e1 que voc\u00ea n\u00e3o deseja consultar cada tabela individualmente.<\/p>\n<p>Podemos criar facilmente uma rela\u00e7\u00e3o simples de um-para-muitos no Laravel para nos ajudar, como quando precisamos consultar os produtos, podemos fazer isso usando o modelo Product.<\/p>\n<figure style=\"width: 1158px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/05\/pasted-image-0-6.png\" alt=\"Schema do banco de dados com tr\u00eas tabelas e uma tabela conjunta representando um relacionamento \" width=\"1158\" height=\"610\"><figcaption class=\"wp-caption-text\">Schema do banco de dados com tr\u00eas tabelas e uma tabela conjunta representando um relacionamento polim\u00f3rfico.<\/figcaption><\/figure>\n<h2>Relacionamento um-para-um<\/h2>\n<p>Sendo a primeira rela\u00e7\u00e3o b\u00e1sica que o Laravel oferece, ela associa duas tabelas de forma que uma linha da primeira tabela esteja correlacionada com apenas uma linha da outra tabela.<\/p>\n<p>Para ver isso em a\u00e7\u00e3o, temos de criar dois modelos com sua pr\u00f3pria migra\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-bash\">php artisan make:model Tenant \nPhp artisan make:model Rent<\/code><\/pre>\n<p>Neste ponto, temos dois modelos: um \u00e9 o Tenant (locat\u00e1rio) e o outro \u00e9 o Rent (aluguel).<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>Como o Eloquent determina o relacionamento de chave estrangeira com base no nome do modelo principal (Tenant, nesse caso), o modelo Rent pressup\u00f5e que existe uma chave estrangeira <strong>tenant_id<\/strong>.<\/p>\n<p>Voc\u00ea pode substitu\u00ed-la facilmente com um argumento adicional para o m\u00e9todo <strong>hasOne<\/strong>:<\/p>\n<pre><code class=\"language-php\">return $this- &gt;hasOne(Rent::class, \"custom_key\");<\/code><\/pre>\n<p>O Eloquent tamb\u00e9m assume que existe uma correspond\u00eancia entre a chave estrangeira definida e a chave prim\u00e1ria do principal (modelo Tenant). Por padr\u00e3o, ele procurar\u00e1 fazer a correspond\u00eancia entre <strong>tenant_id<\/strong> e a chave <strong>id<\/strong> do registro Tenant. Podemos substituir isso por um terceiro argumento no m\u00e9todo <strong>hasOne<\/strong>, de modo que ele corresponda a outra chave:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class, \"custom_key\", \"other_key\"); <\/code><\/pre>\n<p>Agora que definimos a rela\u00e7\u00e3o de um-para-um entre os modelos, podemos us\u00e1-la facilmente, assim:<\/p>\n<pre><code class=\"language-php\">$rent = Tenant::find(10)-&gt;rent;<\/code><\/pre>\n<p>Com essa linha de c\u00f3digo, obtemos o aluguel do locat\u00e1rio com o ID 10, caso ele exista.<\/p>\n<h2>Relacionamento um-para-muitos<\/h2>\n<p>Assim como o relacionamento anterior, este definir\u00e1 relacionamentos entre um modelo principal \u00fanico e v\u00e1rios modelos secund\u00e1rios. \u00c9 improv\u00e1vel que nosso locat\u00e1rio tenha apenas uma conta de aluguel, pois se trata de um pagamento recorrente, portanto, ele ter\u00e1 v\u00e1rios pagamentos.<\/p>\n<p>Nesse caso, nosso relacionamento anterior tem falhas, e podemos corrigi-las:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>Antes de chamarmos o m\u00e9todo para obter os alugu\u00e9is, \u00e9 bom saber que as rela\u00e7\u00f5es servem como construtores de consultas, portanto, podemos adicionar restri\u00e7\u00f5es (como aluguel entre datas, pagamento m\u00ednimo etc.) e encade\u00e1-las para obter o resultado desejado:<\/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, como na rela\u00e7\u00e3o anterior, podemos substituir as chaves estrangeiras e locais passando argumentos adicionais:<\/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>Agora temos todos os alugu\u00e9is de um locat\u00e1rio, mas o que fazemos quando sabemos o valor do aluguel e queremos descobrir a quem ele pertence? Podemos usar a propriedade <strong>belongsTo<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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 agora podemos obter o locat\u00e1rio facilmente:<\/p>\n<pre><code class=\"language-php\">$tenant = Rent::find(1)-&gt;tenant;<\/code><\/pre>\n<p>Para o m\u00e9todo <strong>belongsTo<\/strong>, tamb\u00e9m podemos substituir as chaves estrangeiras e locais, como fizemos anteriormente.<\/p>\n<h2>Relacionamento Has-One-Of-Many<\/h2>\n<p>Como nosso modelo Tenant pode ser associado a muitos modelos Rent, queremos recuperar facilmente o modelo relacionado mais recente ou mais antigo dos relacionamentos.<\/p>\n<p>Uma maneira conveniente de fazer isso \u00e9 combinar os m\u00e9todos <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>Por padr\u00e3o, estamos obtendo os dados com base na chave prim\u00e1ria, que pode ser classificada, mas podemos criar nossos pr\u00f3prios filtros para o m\u00e9todo <strong>ofMany<\/strong>:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;hasOne(Rent::class)-&gt;ofMany('price', 'min');<\/code><\/pre>\n<h2>Relacionamentos HasOneThrough e HasManyThrough<\/h2>\n<p>Os m\u00e9todos <strong>-Through <\/strong>sugerem que nossos modelos ter\u00e3o de passar por outro modelo para estabelecer um relacionamento com o modelo desejado. Por exemplo, podemos associar o Aluguel ao Locador, mas o Aluguel deve passar primeiro pelo Locat\u00e1rio para chegar ao Locador.<\/p>\n<p>As chaves das tabelas necess\u00e1rias para isso seriam as seguintes:<\/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>Ap\u00f3s visualizar a apar\u00eancia de nossas tabelas, podemos criar os modelos:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>O primeiro argumento do m\u00e9todo <strong>hasOneThrough<\/strong> \u00e9 o modelo que voc\u00ea deseja acessar, e o segundo argumento \u00e9 o modelo pelo qual voc\u00ea passar\u00e1.<\/p>\n<p>E, assim como antes, voc\u00ea pode substituir as chaves estrangeiras e locais. Agora que temos dois modelos, temos dois de cada para substituir nesta ordem:<\/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>Da mesma forma, o relacionamento &#8220;Has Many Through&#8221; no Laravel Eloquent \u00e9 \u00fatil quando voc\u00ea deseja acessar registros em uma tabela distante por meio de uma tabela intermedi\u00e1ria. Vamos considerar um exemplo com tr\u00eas tabelas:<\/p>\n<ul>\n<li>pa\u00eds<\/li>\n<li>usu\u00e1rios<\/li>\n<li>jogos<\/li>\n<\/ul>\n<p>Cada pa\u00eds tem muitos usu\u00e1rios, e cada usu\u00e1rio tem muitos jogos. Queremos recuperar todos os jogos pertencentes a um pa\u00eds por meio da tabela User.<\/p>\n<p>Voc\u00ea definiria as tabelas da seguinte forma:<\/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>Agora voc\u00ea deve definir o modelo do Eloquent para cada uma das tabelas:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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 App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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 App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>Agora podemos chamar o m\u00e9todo <strong>games()<\/strong> do modelo Country para obter todos os jogos porque estabelecemos o relacionamento &#8220;Has Many Through&#8221; entre Country e Game por meio do modelo 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>Relacionamento muitos-para-muitos<\/h2>\n<p>O relacionamento de muitos-para-muitos \u00e9 mais complicado. Um bom exemplo \u00e9 um funcion\u00e1rio com v\u00e1rias fun\u00e7\u00f5es. Uma fun\u00e7\u00e3o tamb\u00e9m pode ser atribu\u00edda a v\u00e1rios funcion\u00e1rios. Essa \u00e9 a base do relacionamento de muitos-para-muitos.<\/p>\n<p>Para isso, precisamos ter as tabelas <strong>employees<\/strong>, <strong>roles<\/strong> e <strong>role_employees<\/strong>.<\/p>\n<p>Nossa estrutura de tabela do banco de dados ter\u00e1 a seguinte apar\u00eancia:<\/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>Conhecendo a estrutura das tabelas de relacionamento, podemos facilmente definir nosso <strong>modelo Employee<\/strong> como <strong>belongToMany<\/strong> <strong>Role<\/strong>.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Employee extends Model\n{\n    public function roles() \n    {\n        return $this- &gt;belongsToMany(Role::class);\n    }\n}<\/code><\/pre>\n<p>Ap\u00f3s definirmos isso, podemos acessar todas as fun\u00e7\u00f5es de um funcion\u00e1rio e at\u00e9 mesmo filtr\u00e1-las:<\/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>Como todos os outros m\u00e9todos, podemos substituir as chaves estrangeiras e locais do m\u00e9todo <strong>belongsToMany<\/strong>.<\/p>\n<p>Para definir a rela\u00e7\u00e3o inversa do <strong>belongsToMany<\/strong>, basta usar o mesmo m\u00e9todo, mas agora no m\u00e9todo secund\u00e1rio, com o principal como argumento.<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Role extends Model\n{\n    public function employees() \n    {\n        return $this-&gt;belongsToMany(Employee::class);\n    }\n}<\/code><\/pre>\n<h3>Usos da tabela intermedi\u00e1ria<\/h3>\n<p>Como voc\u00ea deve ter notado, quando usamos o relacionamento muitos-para-muitos, sempre devemos ter uma tabela intermedi\u00e1ria. Nesse caso, estamos usando a tabela <strong>role_employees<\/strong>.<\/p>\n<p>Por padr\u00e3o, nossa tabela din\u00e2mica conter\u00e1 apenas o atributo id. Se quisermos outros atributos, teremos de especific\u00e1-los da seguinte forma:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withPivot(\"active\", \"created_at\");<\/code><\/pre>\n<p>Se quisermos inserir um shortcode na tabela din\u00e2mica para os registros de data e hora, podemos fazer isso:<\/p>\n<pre><code class=\"language-php\">return $this-&gt;belongsToMany(Employee::class)-&gt;withTimestamps();<\/code><\/pre>\n<p>Um truque que voc\u00ea deve saber \u00e9 que podemos personalizar o nome &#8220;pivot&#8221; para qualquer coisa que se adapte melhor ao nosso aplicativo:<\/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>Filtrar os resultados de uma consulta eloquente \u00e9 um conhecimento obrigat\u00f3rio para qualquer desenvolvedor que queira aprimorar seu jogo e <a href=\"https:\/\/kinsta.com\/pt\/blog\/desempenho-laravel\/\">otimizar seus aplicativos Laravel<\/a>.<\/p>\n<p>Portanto, o Laravel oferece um recurso fant\u00e1stico de piv\u00f4s, que pode ser usado para filtrar os dados que voc\u00ea deseja coletar. Portanto, em vez de usar outros recursos, como <a href=\"https:\/\/kinsta.com\/pt\/blog\/banco-de-dados-laravel\/\">transa\u00e7\u00f5es do banco de dados<\/a>, para obter nossos dados em partes, podemos filtr\u00e1-los com m\u00e9todos \u00fateis como <strong>wherePivot, wherePivotIn<\/strong>,<strong> wherePivotNotIn<\/strong>,<strong> wherePivotBetween<\/strong>,<strong> wherePivotNotBetween<\/strong>,<strong> wherePivotNull<\/strong>,<strong> wherePivotNotNull<\/strong> e podemos us\u00e1-los ao definir relacionamentos entre tabelas!<\/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>Um \u00faltimo recurso incr\u00edvel \u00e9 que podemos ordenar por piv\u00f4s:<\/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>Relacionamentos Polymorphic<\/h2>\n<p>A palavra Polymorphic vem do grego e significa &#8220;muitas formas&#8221; Assim, um modelo em nosso aplicativo pode assumir v\u00e1rias formas, o que significa que ele pode ter mais de uma associa\u00e7\u00e3o. Imagine que estamos criando um aplicativo com blogs, v\u00eddeos, enquetes etc. Um usu\u00e1rio pode criar um coment\u00e1rio para qualquer um deles. Portanto, um <strong>modelo de coment\u00e1rio<\/strong> pode pertencer aos modelos de <strong>blogs<\/strong>, <strong>v\u00eddeos<\/strong> e <strong>enquetes<\/strong>.<\/p>\n<h2>Polim\u00f3rfico de um-para-um<\/h2>\n<p>Esse tipo de relacionamento \u00e9 semelhante a um relacionamento padr\u00e3o de um-para-um. A \u00fanica diferen\u00e7a \u00e9 que o modelo secund\u00e1rio pode pertencer a mais de um tipo de modelo com uma \u00fanica associa\u00e7\u00e3o.<\/p>\n<p>Por exemplo, um modelo <strong>Tenant <\/strong>e <strong>Landlord<\/strong>\u00a0pode compartilhar uma rela\u00e7\u00e3o polim\u00f3rfica com um modelo <strong>WaterBill<\/strong>.<\/p>\n<p>A estrutura da tabela pode ser a seguinte:<\/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>Estamos usando waterbillable_id para a identifica\u00e7\u00e3o do <strong>landlord <\/strong>ou <strong>tenant<\/strong>, enquanto waterbillable_type cont\u00e9m o nome da classe do modelo principal. A coluna type \u00e9 usada pelo Eloquent para descobrir qual modelo principal voc\u00ea deve retornar.<\/p>\n<p>A defini\u00e7\u00e3o do modelo para esse relacionamento ter\u00e1 a seguinte apar\u00eancia:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>Quando tivermos tudo isso pronto, poderemos acessar os dados dos modelos 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>Polim\u00f3rfico de um-para-muitos<\/h2>\n<p>Isso \u00e9 semelhante a uma rela\u00e7\u00e3o regular de um para muitos, a \u00fanica diferen\u00e7a fundamental \u00e9 que o modelo secund\u00e1rio pode pertencer a mais de um tipo de modelo, usando uma \u00fanica associa\u00e7\u00e3o.<\/p>\n<p>Em um aplicativo como o Facebook, os usu\u00e1rios podem comentar em publica\u00e7\u00f5es, v\u00eddeos, enquetes, live etc. Com uma associa\u00e7\u00e3o polim\u00f3rfica de um-para-muitos, podemos usar uma \u00fanica tabela de <strong>comments<\/strong>\u00a0para armazenar os coment\u00e1rios de todas as categorias que temos. A estrutura de nossas tabelas seria mais ou menos assim:<\/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>O commentable_id \u00e9 o ID do registro, e o commentable_type \u00e9 o tipo de classe, para que o Eloquent saiba o que procurar. Quanto \u00e0 estrutura do modelo, ela \u00e9 muito semelhante \u00e0 polim\u00f3rfica um-para-muitos:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>Agora, para recuperar os coment\u00e1rios de uma live, podemos simplesmente chamar o m\u00e9todo find com o id, e agora temos acesso \u00e0 classe iter\u00e1vel de coment\u00e1rios:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse App\\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>E se tivermos o coment\u00e1rio e quisermos descobrir a quem ele pertence, acessaremos o m\u00e9todo commentable:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nuse App\\Models\\Comment;\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>Polim\u00f3rfico um-de-muitos<\/h2>\n<p>Em muitos aplicativos em escala, queremos uma maneira f\u00e1cil de interagir com modelos e entre eles. Talvez queiramos a primeira ou a \u00faltima publica\u00e7\u00e3o de um usu\u00e1rio, o que pode ser feito com uma combina\u00e7\u00e3o dos m\u00e9todos <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>Os m\u00e9todos <strong>latestOfMany<\/strong> e <strong>oldestOfMany <\/strong>est\u00e3o recuperando o modelo mais recente ou mais antigo com base na chave prim\u00e1ria do modelo, que era a condi\u00e7\u00e3o para que ele pudesse ser classificado.<\/p>\n<p>Em alguns casos, n\u00e3o queremos classificar pelo ID, talvez tenhamos alterado a data de publica\u00e7\u00e3o de algumas publica\u00e7\u00f5es e as queremos nessa ordem, n\u00e3o por seu ID.<\/p>\n<p>Voc\u00ea pode fazer isso passando dois par\u00e2metros para o m\u00e9todo <strong>ofMany<\/strong> para ajudar nessa tarefa. O primeiro par\u00e2metro \u00e9 a <strong>key<\/strong>\u00a0pela qual queremos filtrar, e o segundo \u00e9 o <strong>sorting method<\/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>Com isso em mente, \u00e9 poss\u00edvel criar rela\u00e7\u00f5es mais avan\u00e7adas para isso! Imagine que voc\u00ea tenha este cen\u00e1rio. Pedimos que voc\u00ea crie uma lista de todas as publica\u00e7\u00f5es atuais na ordem em que foram publicadas. O problema surge quando temos duas publica\u00e7\u00f5es com o mesmo valor published_at e quando as publica\u00e7\u00f5es est\u00e3o programadas para serem publicadas no futuro.<\/p>\n<p>Para fazer isso, podemos passar a ordem em que queremos que os filtros sejam aplicados ao m\u00e9todo <strong>ofMany<\/strong>. Dessa forma, ordenamos por published_at e, se forem iguais, ordenamos por id. Em segundo lugar, podemos aplicar uma fun\u00e7\u00e3o de consulta ao m\u00e9todo <strong>ofMany<\/strong> para excluir todos os artigos programados para publica\u00e7\u00e3o!<\/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>Polim\u00f3rfico de muitos-para-muitos<\/h2>\n<p>O m\u00e9todo polim\u00f3rfico de muitos-para-muitos \u00e9 um pouco mais complexo do que o normal. Uma situa\u00e7\u00e3o comum \u00e9 ter tags que se aplicam a mais ativos em seu aplicativo. Por exemplo, no TikTok, temos tags que podem ser aplicadas a v\u00eddeos, curtas, stories, etc.<\/p>\n<p>O polim\u00f3rfico muitos-para-muitos nos permite ter uma \u00fanica tabela de tags associadas a v\u00eddeos, curtas e Stories.<\/p>\n<p>A estrutura da tabela \u00e9 simples:<\/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>Com as tabelas prontas, podemos criar o modelo e usar o m\u00e9todo <strong>morphToMany<\/strong>. Esse m\u00e9todo aceita o nome da classe do modelo e o &#8220;nome da rela\u00e7\u00e3o&#8221;:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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>E, com isso, podemos definir facilmente a rela\u00e7\u00e3o inversa. Sabemos que, para cada modelo secund\u00e1rio, queremos chamar o m\u00e9todo <strong>morphedByMany<\/strong>:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace App\\Models;\nuse Illuminate\\Database\\Eloquent\\Model;\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 agora, quando obtivermos uma tag, poderemos recuperar todos os v\u00eddeos e Stories relacionados a essa tag!<\/p>\n<pre><code class=\"language-php\">&lt;?php\nuse App\\Model\\Tag;\n\n$tag = Tag::find(10);\n$posts = $tag-&gt;stories;\n$videos = $tag-&gt;stories;<\/code><\/pre>\n<h2>Otimize a velocidade do Eloquent<\/h2>\n<p>Ao trabalhar com o Eloquent ORM do Laravel, \u00e9 essencial que voc\u00ea entenda como otimizar as consultas ao banco de dados e minimizar o tempo e a mem\u00f3ria necess\u00e1rios para buscar dados. Uma maneira de fazer isso \u00e9 <a href=\"https:\/\/kinsta.com\/pt\/blog\/cache-do-laravel\/\">implementar o cache<\/a> em seu aplicativo.<\/p>\n<p>O Laravel oferece um sistema de cache flex\u00edvel que suporta v\u00e1rios backends, como <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<a href=\"https:\/\/www.ibm.com\/docs\/en\/zvm\/7.1?topic=reference-file-caching\" target=\"_blank\" rel=\"noopener noreferrer\"> cache baseado em arquivo<\/a>. Ao armazenar em cache os resultados das consultas do Eloquent, voc\u00ea pode reduzir o n\u00famero de consultas ao banco de dados, tornando seu aplicativo mais r\u00e1pido e valioso.<\/p>\n<p>Al\u00e9m disso, voc\u00ea pode usar o <a href=\"https:\/\/laravel.com\/docs\/10.x\/queries\" target=\"_blank\" rel=\"noopener noreferrer\">construtor de consultas<\/a> do Laravel para criar consultas complexas adicionais, otimizando ainda mais o desempenho do seu aplicativo.<\/p>\n<h2>Resumo<\/h2>\n<p>Concluindo, os relacionamentos Eloquent s\u00e3o um recurso poderoso do Laravel que permite aos desenvolvedores trabalhar facilmente com dados relacionados. De relacionamentos um-para-um a muitos-para-muitos, o Eloquent fornece uma sintaxe simples e intuitiva para voc\u00ea definir e consultar esses relacionamentos.<\/p>\n<p>Como desenvolvedor do Laravel, o dom\u00ednio dos relacionamentos do Eloquent pode melhorar muito seu fluxo de trabalho de desenvolvimento e tornar seu c\u00f3digo mais eficiente e leg\u00edvel. Caso voc\u00ea esteja interessado em aprender mais sobre o Laravel, a Kinsta tem v\u00e1rios recursos dispon\u00edveis, incluindo um <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutoriais-laravel\/\">tutorial<\/a> sobre como come\u00e7ar a usar o Laravel e um artigo sobre <a href=\"https:\/\/kinsta.com\/pt\/blog\/salario-desenvolvedor-laravel\/\">sal\u00e1rios de desenvolvedores do Laravel<\/a>.<\/p>\n<p>A Kinsta oferece solu\u00e7\u00f5es de hospedagem gerenciada que facilitam a <a href=\"https:\/\/sevalla.com\/application-hosting\/\">implanta\u00e7\u00e3o e o gerenciamento de aplicativos Laravel<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Frequentemente, em algum ponto da carreira de qualquer desenvolvedor, \u00e9 necess\u00e1rio interagir com um banco de dados. \u00c9 nesse momento que o Eloquent, o mapeador objeto-relacional &#8230;<\/p>\n","protected":false},"author":267,"featured_media":59996,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[1018,984],"class_list":["post-59995","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-ferramentas-desenvolvimento-web","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>Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.\" \/>\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\/pt\/blog\/relacoes-eloquent-laravel\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado\" \/>\n<meta property=\"og:description\" content=\"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-07T17:12:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-25T15:36:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/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=\"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Coman Cosmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/\"},\"author\":{\"name\":\"Coman Cosmin\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\"},\"headline\":\"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado\",\"datePublished\":\"2023-10-07T17:12:06+00:00\",\"dateModified\":\"2023-10-25T15:36:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/\"},\"wordCount\":2445,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/\",\"name\":\"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg\",\"datePublished\":\"2023-10-07T17:12:06+00:00\",\"dateModified\":\"2023-10-25T15:36:54+00:00\",\"description\":\"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/laravel\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da\",\"name\":\"Coman Cosmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/comancosmin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado - Kinsta\u00ae","description":"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.","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\/pt\/blog\/relacoes-eloquent-laravel\/","og_locale":"pt_PT","og_type":"article","og_title":"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado","og_description":"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.","og_url":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-10-07T17:12:06+00:00","article_modified_time":"2023-10-25T15:36:54+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg","type":"image\/jpeg"}],"author":"Coman Cosmin","twitter_card":"summary_large_image","twitter_description":"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Coman Cosmin","Tempo estimado de leitura":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/"},"author":{"name":"Coman Cosmin","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da"},"headline":"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado","datePublished":"2023-10-07T17:12:06+00:00","dateModified":"2023-10-25T15:36:54+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/"},"wordCount":2445,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/","url":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/","name":"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg","datePublished":"2023-10-07T17:12:06+00:00","dateModified":"2023-10-25T15:36:54+00:00","description":"Ao trabalhar com tabelas em um banco de dados relacional, podemos caracterizar relacionamentos como conex\u00f5es entre tabelas.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/06\/laravel-relationships.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/relacoes-eloquent-laravel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Laravel","item":"https:\/\/kinsta.com\/pt\/topicos\/laravel\/"},{"@type":"ListItem","position":3,"name":"Rela\u00e7\u00f5es Eloquent no Laravel: Um Guia Detalhado"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/aa307e51da3929c7aead1f4b4439f3da","name":"Coman Cosmin","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/comancosmin\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/59995","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/267"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=59995"}],"version-history":[{"count":11,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/59995\/revisions"}],"predecessor-version":[{"id":64245,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/59995\/revisions\/64245"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/jp"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/translations\/nl"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/59995\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/59996"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=59995"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=59995"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=59995"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}