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

时间:2014-06-30 18:14:21

标签: php laravel relationship

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

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

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

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

<?php
    $groups = Group::with('users')->all();
?>

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

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

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

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

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

4 个答案:

答案 0 :(得分:1)

{
   return $this->belongsToMany('User')->select(array('id', 'name'));
}

使用此

答案 1 :(得分: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'));

答案 2 :(得分:0)

像这样使用。

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

    class Group extends Eloquent {
        public function users()
        {
            return $this->belongsToMany('User')->select(array('id', 'name'));
        }
    }
?>

答案 3 :(得分:0)

除了选择关系中的列外,还可以选择以下列:

$groups = Group::with('users:id,first_name,last_name')->all();
  

选择关系中的列时,请确保已选择关系表的外键