如何转化雄辩关系对象?

0 laravel eloquent

我们有以下型号 -

邮政

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

creator -> belongsTo User

group -> belongsTo group
Run Code Online (Sandbox Code Playgroud)

用户

posts -> hasMany Posts

avatar -> hasOne Media
Run Code Online (Sandbox Code Playgroud)

媒体

user -> belongsTo User
Run Code Online (Sandbox Code Playgroud)

团体

post - belongsTo Post
Run Code Online (Sandbox Code Playgroud)

当我使用 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
});
Run Code Online (Sandbox Code Playgroud)

小智 5

当您调用 时$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;
});
Run Code Online (Sandbox Code Playgroud)