我已经尝试过各种限制列的方法,这些方法在我的多对多关系中返回,但似乎都没有。
背景 - 不是必需的,但要全面了解
基本上,在我的应用程序中,我想为当前登录的用户构建联系人列表。 Administrator
和Billing
用户应该能够与包括Customer
群组用户在内的所有人联系。
Customer
应该只能与Administrator
和Billing
联系。
所以解决这个问题的方法首先是确定用户所在的群组。
$userGroups = Sentry::getUser()->getGroups()->lists('name', 'id');
然后遍历这些群组,查看该用户是否在群组Administrator
或Billing
或Customer
中,并为该用户构建联系人群组。
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);
}
}
问题 - 看来我无法选择要在belongsToMany关系上选择的特定列。
我试过了:
$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');
}
}
无论哪种方式,查询都会运行,但它会返回整个user
对象并完全忽略我的选择。
因此,当我返回一个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);
这真是笨重,低效,似乎浪费时间。有没有更好的方法来实现上述目标?
答案 0 :(得分:0)
由于某些原因,选择 belongsToMany 的特定列无效。 但我找到了另一种解决方案。
laravel中有一项规定, Converting to Arrays or json ,允许您在使用toArray()或toJson时将特定列列入白名单/黑名单。
防止特定字段出现在关系中:
class User extends Eloquent{
protected $hidden = array("persist_code","created_at","updated_at","deleted_at","last_login");
}
相反,如果您希望允许特定字段:
protected $visible = array("Visibile fields");