Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update eloquent-relationships.md #178

Open
wants to merge 1 commit into
base: 11.x
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 90 additions & 3 deletions eloquent-relationships.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
git: 9f36b02f2c2968ad2c6945df79d9eaf31dfdd224
git: b967f72817e992d526405d0712b606aa164b9efb
---

# Eloquent · Отношения
Expand Down Expand Up @@ -32,7 +32,7 @@ git: 9f36b02f2c2968ad2c6945df79d9eaf31dfdd224
Но, прежде чем углубляться в использование отношений, давайте узнаем, как определить каждый тип отношений, поддерживаемый Eloquent.

<a name="one-to-one"></a>
### Один к одному
### Один к одному / Имеет один

Отношения «один-к-одному» – это очень простой тип отношений базы данных. Например, модель `User` может быть связана с одной моделью `Phone`. Чтобы определить это отношение, мы поместим метод `phone` в модель `User`. Метод `phone` должен вызывать метод `hasOne` и возвращать его результат. Метод `hasOne` доступен для вашей модели через базовый класс `Illuminate\Database\Eloquent\Model` модели:

Expand Down Expand Up @@ -112,7 +112,7 @@ Eloquent определяет имя внешнего ключа, анализи
}

<a name="one-to-many"></a>
### Один ко многим
### Один ко многим / Имеет много

Отношение «один-ко-многим» используется для определения отношений, в которых одна модель является родительской для одной или нескольких дочерних моделей. Например, пост в блоге может содержать бесконечное количество комментариев. Как и все другие отношения Eloquent, отношения «один-ко-многим» определяются путем определения метода в вашей модели Eloquent:

Expand Down Expand Up @@ -158,6 +158,53 @@ Eloquent определяет имя внешнего ключа, анализи

return $this->hasMany(Comment::class, 'foreign_key', 'local_key');

<a name="automatically-hydrating-parent-models-on-children"></a>
#### Автоматическое увлажнение родительских моделей на дочерних объектах
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай как то хорошо сформулируем, просто "увлажнение" через чур ))

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Меня тоже это как-то кольнуло в глаз.
Это все из разряда гидратации/дегидратации объектов.
Как вариант тогда: "Автоматическое гидратирование родительских моделей на дочерних объектах"


Даже при использовании быстрой загрузки Eloquent могут возникнуть проблемы с запросами «N + 1», если вы попытаетесь получить доступ к родительской модели из дочерней модели при циклическом переборе дочерних моделей:

```php
$posts = Post::with('comments')->get();

foreach ($posts as $post) {
foreach ($post->comments as $comment) {
echo $comment->post->title;
}
}
```

В приведенном выше примере возникла проблема запроса «N + 1», поскольку, хотя комментарии были готовы загружаться для каждой модели `Post`, Eloquent не выполняет автоматическую гидратацию родительской `Post` в каждой дочерней модели `Comment`.

Если вы хотите, чтобы Eloquent автоматически переносил родительские модели в свои дочерние элементы, вы можете вызвать метод `chaperone` при определении отношения `hasMany`:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Post extends Model
{
/**
* Get the comments for the blog post.
*/
public function comments(): HasMany
{
return $this->hasMany(Comment::class)->chaperone();
}
}

Или, если вы хотите включить автоматическую гидратацию родительского элемента во время выполнения, вы можете вызвать модель `chaperone` при загрузке связи:

```php
use App\Models\Post;

$posts = Post::with([
'comments' => fn ($comments) => $comments->chaperone(),
])->get();
```

<a name="one-to-many-inverse"></a>
#### Определение обратной связи Один ко многим

Expand Down Expand Up @@ -971,6 +1018,46 @@ return $this->throughEnvironments()->hasDeployments();

Отношение `commentable` в модели `Comment` вернет либо экземпляр `Post`, либо `Video`, в зависимости от того, какой тип модели является родительским для комментария.

<a name="polymorphic-automatically-hydrating-parent-models-on-children"></a>
#### Автоматическое увлажнение родительских моделей на дочерних объектах

Даже при использовании быстрой загрузки Eloquent могут возникнуть проблемы с запросами «N + 1», если вы попытаетесь получить доступ к родительской модели из дочерней модели при циклическом переборе дочерних моделей:

```php
$posts = Post::with('comments')->get();

foreach ($posts as $post) {
foreach ($post->comments as $comment) {
echo $comment->commentable->title;
}
}
```

В приведенном выше примере возникла проблема запроса «N + 1», поскольку, хотя комментарии были готовы загружаться для каждой модели `Post`, Eloquent не выполняет автоматическую гидратацию родительской `Post` в каждой дочерней модели `Comment`.

Если вы хотите, чтобы Eloquent автоматически переносил родительские модели в свои дочерние элементы, вы можете вызвать метод `chaperone` при определении отношения `hasMany`:

class Post extends Model
{
/**
* Get all of the post's comments.
*/
public function comments(): MorphMany
{
return $this->morphMany(Comment::class, 'commentable')->chaperone();
}
}

Или, если вы хотите включить автоматическую гидратацию родительского элемента во время выполнения, вы можете вызвать модель `chaperone` при загрузке связи:

```php
use App\Models\Post;

$posts = Post::with([
'comments' => fn ($comments) => $comments->chaperone(),
])->get();
```

<a name="one-of-many-polymorphic-relations"></a>
### Один из многих (полиморфное)

Expand Down