Как преобразовать красноречивый объект отношения? - PullRequest
0 голосов
/ 04 июня 2019

У нас есть следующие модели -

Сообщение

----------------------------------------------
| id | title | text | creator | status | etc |
----------------------------------------------
|    |       |      |         |        |     |
----------------------------------------------

creator -> belongsTo User

group -> belongsTo group

Пользователь

posts -> hasMany Posts

avatar -> hasOne Media

Media

user -> belongsTo User

* Группа 1019 *

post - belongsTo Post

Когда я выбираю сообщения, используя eloquent, я могу использовать функцию преобразования для преобразования атрибутов сообщений, но не могу преобразовать отношения в коллекциях сообщений.

$posts = Post::where('status', 'active')
            ->with(['creator.avatar','group'])
            ->get();

$posts->transform(function($post) {
    $post->title = 'Transformed'; // works
    $post->creator->avatar = ['path'=>'/avatar/','file_name'=>'a.png']; // does not work
});

1 Ответ

1 голос
/ 04 июня 2019

Когда вы вызываете $post->creator, вы, по сути, вызываете $post->getRelation('creator') через «магический метод».

Это важно, потому что это означает, что вы устанавливаете свойство для объекта, возвращаемогоgetRelation метод, вы не обновляете отношение создателя по ссылке - поэтому при повторном вызове getRelation('creator') возвращается исходное значение отношения.

Следовательно, для достижения того, что вы хотитедля этого необходимо перезаписать значение отношения creator:

$posts->transform(function ($post) {
    $post->title = 'Transformed';

    $creator = $post->creator;

    $creator->avatar = [
        'path' => '/avatar/',
        'file_name' => 'a.png'
    ];

    $post->setRelation('creator', $creator); // or $post->creator = $creator;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...