【问题标题】:Laravel - Selecting specific columns on many-to-many relationshipsLaravel - 在多对多关系上选择特定列
【发布时间】:2014-08-21 04:38:35
【问题描述】:

我的 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');
        }
    }
?>

我的 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 中是否仍然存在。

有人遇到过这个问题并成功解决了吗?

【问题讨论】:

    标签: php laravel relationship


    【解决方案1】:
    {
       return $this->belongsToMany('User')->select(array('id', 'name'));
    }
    

    使用这个

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,这确实有效。但是,如果我在整个控制器的不同操作中进行类似查询,我必须将相同的数组传递给所有这些操作。我的目标是找到一个类似于其他类型关系的解决方案。
      • 您始终可以在模型中创建一个执行这些常见查询的函数,并从控制器中的不同操作中调用它。
      【解决方案3】:

      这样使用。

      <?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'));
              }
          }
      ?>
      

      【讨论】:

        【解决方案4】:

        您可以选择如下列,而不是选择关系中的列:

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

        当您在关系中选择列时,请确保您选择了关系表的外键

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-22
          • 2014-09-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-13
          • 2017-09-26
          • 2019-09-28
          • 2017-02-22
          相关资源
          最近更新 更多