Eloquent指定belongsToMany关系的关系列

时间:2014-03-27 10:44:58

标签: json laravel many-to-many eloquent has-and-belongs-to-many

我已经尝试过各种限制列的方法,这些方法在我的多对多关系中返回,但似乎都没有。

背景 - 不是必需的,但要全面了解

基本上,在我的应用程序中,我想为当前登录的用户构建联系人列表。 AdministratorBilling用户应该能够与包括Customer群组用户在内的所有人联系。

Customer应该只能与AdministratorBilling联系。

所以解决这个问题的方法首先是确定用户所在的群组。

$userGroups = Sentry::getUser()->getGroups()->lists('name', 'id');

然后遍历这些群组,查看该用户是否在群组AdministratorBillingCustomer中,并为该用户构建联系人群组。

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);

这真是笨重,低效,似乎浪费时间。有没有更好的方法来实现上述目标?

1 个答案:

答案 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");