Laravel - 在多对多关系中选择特定列

caf*_*nso 9 php relationship laravel

我在Laravel 4.2 Web应用程序中有两个模型,UserGroup.用户可以是许多组的成员,组可以有许多成员.因此,两种模型都具有多对多关系:

<?php
    class User extends Eloquent {
        public function groups()
        {
            return $this->belongsToMany('Group');
        }
    }

    class Group extends Eloquent {
        public function users()
        {
            return $this->belongsToMany('User');
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

我的一个API资源是/groups,列出了应用中可用的所有群组:

<?php
    $groups = Group::with('users')->all();
?>
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是在JSON响应中,每个用户都包含users表中的所有字段(当然不包括$hidden属性中的那些字段).我希望这种关系只返回一组特定的字段而不是整个表.

在其他关系类型中,我可以使用以下语句轻松实现此功能(现在假设用户可能只属于一个组):

<?php
    public function users()
    {
        return $this->hasMany('User')->select(['id', 'first_name', 'last_name']);
    }
?>
Run Code Online (Sandbox Code Playgroud)

然而,上述似乎并不适用于多对多关系.我遇到了这个问题,显然是指同一个问题,看起来这在Laravel 4.1中是不可能的.所选答案的作者tptcat提供了一个关于Laravel的Github问题跟踪器上的问题的链接,但该链接不再有效,我无法确定此问题是否仍在4.2中打开.

有没有人遇到这个并成功设法解决它?

小智 0

all方法接受列名数组作为参数。

如果你查看源代码,就会发现*默认情况下(这意味着一切)。

https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L624-L629

您可以传入所需的列,它应该仅返回指定列的结果。

<?php

$groups = Group::with('users')->all(array('first_column', 'third_column'));
Run Code Online (Sandbox Code Playgroud)