Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 雄辩地指定belongToMany关系的关系列_Json_Laravel_Many To Many_Eloquent_Has And Belongs To Many - Fatal编程技术网

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隐藏字段。如果你想查看它们,你可以使用模型->属性来访问它们。由于管理员页面可能是您希望查看所有字段的唯一位置,您可以使用此解决方法。更好的答案可以在线程中阅读