Json 雄辩地指定belongToMany关系的关系列
我尝试了各种方法来限制在多对多关系中返回的列,但似乎都不起作用 背景-不是真的需要,但要给大局 实际上,在我的应用程序中,我想为当前登录的用户建立一个联系人列表。管理员和计费用户应能够联系所有人,包括集团客户的用户 客户只能联系管理员和帐单 所以我解决这个问题的方法是首先确定用户所在的组Json 雄辩地指定belongToMany关系的关系列,json,laravel,many-to-many,eloquent,has-and-belongs-to-many,Json,Laravel,Many To Many,Eloquent,Has And Belongs To Many,我尝试了各种方法来限制在多对多关系中返回的列,但似乎都不起作用 背景-不是真的需要,但要给大局 实际上,在我的应用程序中,我想为当前登录的用户建立一个联系人列表。管理员和计费用户应能够联系所有人,包括集团客户的用户 客户只能联系管理员和帐单 所以我解决这个问题的方法是首先确定用户所在的组 $userGroups = Sentry::getUser()->getGroups()->lists('name', 'id'); 然后遍历这些组,查看用户是否在组管理员、账单或客户中,并为该用
$userGroups = Sentry::getUser()->getGroups()->lists('name', 'id');
然后遍历这些组,查看用户是否在组管理员、账单或客户中,并为该用户构建联系人组
foreach($userGroups as $group)
{
if ($group === 'Administrator' || $group === 'Billing')
{
$contactGroups = \Group::with('users')->get(['id', 'name']);
}
else if ($group === 'Customer')
{
$contactGroups = \Group::where('name', 'Administrator')
->orWhere('name', 'Billing')
->with('users')
->get(['id', 'name']);
}
else
{
return Response::json('No Contacts found', 404);
}
}
问题-我似乎无法选择特定的列来选择BelongToMany关系
我试过:
$contactGroups = \Group::where('name', 'Administrator')
->orWhere('name', 'Billing')
->with(['users', function($q){
$q->select('id', 'first_name', 'last_name');
}])
->get(['id', 'name']);
我还尝试在组模型中限制选择
class Group extends Eloquent
{
protected $table = 'groups';
public function users()
{
return $this->belongsToMany('User', 'users_groups')
->select('id', 'first_name', 'last_name', 'email', 'telephone');
}
}
无论哪种方式,查询都会运行,但它会返回整个用户对象并完全忽略我的选择
因此,当我返回一个json响应时,我不想要的所有内容都包含在内
因此,作为临时修复,我所做的是迭代每个组中的每个用户,并取消设置我不想要的所有属性
foreach ($contactGroups as $group)
{
foreach($group->users as $user)
{
unset($user->persist_code);
unset($user->created_at);
unset($user->updated_at);
unset($user->deleted_at);
unset($user->last_login);
unset($user->permissions);
unset($user->activated_at);
unset($user->activated);
unset($user->reset_password_code);
unset($user->pivot);
}
}
return Response::json($contactGroups, 200);
这真的很笨重,效率低下,似乎是在浪费时间。是否有更好的方法来实现上述目标?出于某种原因,选择具有belongTomany的特定列不起作用。 但我找到了另一种解决办法 laravel中有一个条款,允许您在使用toArray或toJson时将特定于白名单/黑名单的列 要防止特定字段出现在关系中,请执行以下操作:
class User extends Eloquent{
protected $hidden = array("persist_code","created_at","updated_at","deleted_at","last_login");
}
如果您希望允许特定字段,请改为:
protected $visible = array("Visibile fields");
是的,你的变通方法很有效,谢谢你的回答。。。然而,我又遇到了另一个问题。。。有时,我可能需要一些这些属性。。。黑名单或白名单将**始终**隐藏/显示它们。因此,我需要一种方法来选择我首先需要的列。在模型中隐藏created_at会干扰我的api.v1.admin.user.index路由,因此我确实需要在json响应中返回created_at属性。是的,我没有考虑管理页面,因为这是您想要所有结果的地方。也不可能动态设置$hidden/$visible属性。如果laravel团队计划修复这个问题,或者它将保持这样,有什么消息吗?好的,有一个解决方法。只有toJson和toArray隐藏字段。如果你想查看它们,你可以使用模型->属性来访问它们。由于管理员页面可能是您希望查看所有字段的唯一位置,您可以使用此解决方法。更好的答案可以在线程中阅读