交响乐2。在带有外键的实体上使用 querybuilder 时,如何将外键的 return 值作为 id 序列?

Symfony2. When using querybuilder on entity with foreign keys, how to return values of foreign keys as sequence of ids?

我的存储库中有查询,returns 数组结果:

$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":"my_email@domain.com",
   "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;

我觉得我可以避免这种解决方法,如果我可以 return groups 每个用户作为数字序列。我怎样才能做到这一点?也许存在更好的方法?

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

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

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