试图在资源 Laravel 中返​​回数据透视表

Posted

技术标签:

【中文标题】试图在资源 Laravel 中返​​回数据透视表【英文标题】:Trying to return pivot data in Resource Laravel 【发布时间】:2020-05-28 07:52:50 【问题描述】:

我正在尝试将数据透视数据返回到资源。 数据透视表有效,我可以添加和删除预期的条目,但我无法获取 ActivityResource 中返回的 user_id ... 在 Laravel 文档中,它看起来很简单,我是否遗漏了什么?

// Activity.php
class Activity extends Model

    public function members()
    
        return $this->belongsToMany('App\User', 'activity_user', 'user_id', 'activity_id')->withPivot('activity_id','user_id')->withTimestamps();
    

// User.php
class User extends Authenticatable

    public function joinedactivities()
    
        return $this->belongsToMany('App\Activity');
    

在我的 ActivityController 中,我想返回一个新创建的 ActivityResource 与“急切加载”的关系

// ActivityController 
public function show($id)

    $activity = Activity::with('members')->findOrFail($id);

    /* foreach ($activity->members as $user) 
        echo $user->id . " "; // With this I can actually see the right ids
    
    return;*/

    return new ActivityResource($activity);

活动资源:

public function toArray($request)

    return [
        'id' => $this->id,
        'title' => $this->title,
        'attendees' => $this->whenPivotLoaded('activity_user', function () 
            return $this->pivot->user_id;
        ),
    ];

我没有收到任何错误,而是没有返回参加者字段。我尝试了很多东西,为此苦苦挣扎。非常感谢帮助。 我正在使用 Laravel 6。

【问题讨论】:

【参考方案1】:

->withPivot('activity_id','user_id') 不需要。无论如何,这些字段都会出现在您的关系对象上。对于资源,我认为您可以执行以下操作:

public function toArray($request)

    return [
        'id' => $this->id,
        'title' => $this->title,
        // If the relation 'members' is loaded, get an array of user ids otherwise, return null
        'attendees' => $this->relationLoaded('members') ? $this->members->pluck('pivot.user_id')->unique()->all() : null
    ];

主要问题是关系是多对多的,这意味着有多个枢轴。使用此解决方案,您的对象将如下所示。


    id: 3,
    title: 'A Title',
    attendees: [
        1,
        2,
        3,
    ],

如果您希望将 id 连接在单个字符串中,例如您评论的 foreach,请将 all() 替换为 join(' ')

// If the relation 'members' is loaded, get an string of user ids otherwise, return null
'attendees' => $this->relationLoaded('members') ? $this->members->pluck('pivot.user_id')->unique()->join(' ') : null

    id: 3,
    title: 'A Title',
    attendees: '1 2 3',

【讨论】:

你在用什么relationLoaded()?我在文档中找不到它。 relationLoaded() 是一个公共函数 Illuminate\Database\Eloquent\Model 通过 trait Illuminate\Database\Eloquent\Concerns\HasRelationships。这是very simple function 它的工作原理非常感谢你!!!在这种情况下,我需要使用whenPivotLoaded,因为我认为它就是这样做的?根据:conditional relationships 我不知道。以前从未使用过该功能。

以上是关于试图在资源 Laravel 中返​​回数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

使用邮递员的 PUT/PATCH 请求在 Laravel 中返​​回状态码 0

如何在模型 Laravel 中返​​回多个自定义值

通过 Ajax 调用将数组发送到控制器,然后控制器在 Laravel 中返​​回具有该数组的另一个视图

如何在同一资源LARAVEL中返回数据透视表的数据

在 QAbstractItemModel 中返​​回正数行和零列是不是可以?

Laravel 复选框问题,我无法更新数据透视表