laravel активно загружается с помощью with() и load() после создания родительской модели

Я создаю модель Reply, а затем пытаюсь вернуть объект с его отношением владельца. Вот код, который возвращает пустой объект:

//file: Thread.php
//this returns an empty object !!??
public function addReply($reply)
{
    $new_reply = $this->replies()->create($reply);
    return $new_reply->with('owner');
}

Однако, если я поменяю метод with() на метод load() для загрузки отношения владельца, я получу ожидаемый результат. То есть объект ответа возвращается вместе с соответствующим отношением владельца:

//this works
{
    $new_reply = $this->replies()->create($reply);
    return $new_reply->load('owner');
}

я не понимаю почему. Нужны уточнения.

Спасибо, йасир

1 ответ

Решение

Это потому, что вы должны использовать with когда у вас еще нет объекта (вы делаете запрос), и когда у вас уже есть объект, вы должны использовать load,

Примеры:

Коллекция пользователей:

$users = User::with('profile')->get();

или же:

$users = User::all();
$users->load('profile');

Один пользователь:

$user = User::with('profile')->where('email','sample@example.com')->first();

или же

$user = User::where('email','sample@example.com')->first();
$user->load('profile');

Методы реализации в Laravel

Также вы можете посмотреть на with Реализация метода:

public static function with($relations)
{
    return (new static)->newQuery()->with(
        is_string($relations) ? func_get_args() : $relations
    );
}

поэтому он запускает новый запрос, так что на самом деле он не будет выполнять запрос, пока вы не используете get, first и так далее, где находится load реализация такова:

public function load($relations)
{
    $query = $this->newQuery()->with(
        is_string($relations) ? func_get_args() : $relations
    );

    $query->eagerLoadRelations([$this]);

    return $this;
}

поэтому он возвращает тот же объект, но загружает отношения для этого объекта.

Другие вопросы по тегам