2016-01-29 76 views
0

我有我的资料库查询,返回数组结果:Symfony2。在使用外键的实体上使用querybuilder时,如何将外键的值作为ID序列返回?

$result = $qb 
      ->select('partial u.{id, username, email, lastLogin}', 'partial groups.{id}') 
      ->leftJoin('u.groups', 'groups') 
      ->getQuery() 
      ->getArrayResult(); 

当我请求我的AngularJS应用此查询,我得到一个结果:

[ 
    {"id":1, 
    "username":"Sergio Ivanuzzo", 
    "email":"[email protected]", 
    "lastLogin":null, 
    "groups":[{"id":1}] 
    } 
] 

由于groups的包含对象的数组,我无法解析他们在我的编辑指令(复选框未选中):

<span 
    data-pk="{{ user.id }}" 
    editable-checklist="user.groups" 
    e-ng-options="g.id as g.name for g in groups" 
    e-form="rowform"> 
    {{ User.showGroups(user) }} 
</span> 

groups属性包含类似于[1,2,3]指令正在工作的内容(复选框被正常检查)。

所以,解决这个我是从响应解析每个用户对象:

angular.forEach(response.data, function(user) { 
    var groups = []; 
    angular.forEach(user.groups, function(group) { 
     groups.push(group.id); 
    }); 

    user.groups = groups; 
}); 

$scope.users = response.data; 

我觉得,我能避免这种情况的解决办法,如果我能对每个用户的数字序列返回groups。我怎样才能做到这一点?也许更好的方式存在?

如果您需要额外的数据,请告诉我!非常感谢您的帮助

回答

1

您可以使用过滤器来保留原始数据,如

$scope.toArray = function(groupsAsObjects) { 
    var groups = []; 
    angular.forEach(groupsAsObjects, function(group) { 
     groups.push(group.id); 
    }); 
    return groups; 
}; 

而且

<span 
    data-pk="{{ user.id }}" 
    editable-checklist="user.groups | toArray" 
    e-ng-options="g.id as g.name for g in groups" 
    e-form="rowform"> 
    {{ User.showGroups(user) }} 
</span> 

或者重新映射对象的全阵列作为这样的数组:

$scope.toArray = function(obj, addKey) { 
    if (!obj) 
     return obj; 
    if (addKey === false) { 
     return Object.keys(obj).map(function(key) { 
      return obj[key]; 
     }); 
    } else { 
     return Object.keys(obj).map(function(key) { 
      return Object.defineProperty(obj[key], '$key', { 
       enumerable: false, 
       configurable: true, 
       value: key 
      }); 
     }); 
    } 
};