试图在资源 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
通过 Ajax 调用将数组发送到控制器,然后控制器在 Laravel 中返回具有该数组的另一个视图