Laravel属于ToMany仅返回特定列

时间:2014-02-08 12:42:36

标签: php model laravel pivot-table

因此,我通过数据透视表user_photo在用户和照片之间建立了多对多的关系。我在用户模型中使用belongsToMany('Photo')。然而,麻烦在于我在Photo表中有十几列我不需要(特别是在json响应期间)。所以一个例子是:

//Grab user #987's photos:
User::with('photos')->find(987);
//json output:
{
  id: 987,
  name: "John Appleseed",
  photos: {
    id: 5435433,
    date: ...,
    name: 'feelsgoodman.jpg',
    ....// other columns that I don't need
  }
}

是否可以修改此方法,以便Photos模型只返回接受的列(例如由数组['name', 'date']指定)?

user.php的

public function photos()
{
  return $this->belongsToMany('Photo');
}

注意:我只想在执行User->belongsToMany->Photo时选择特定列。当做Photo::all()之类的事情时,是的,我希望所有列都正常。

编辑:我已尝试过Get specific columns using "with()" function in Laravel Eloquent,但列仍在被选中。另外https://github.com/laravel/laravel/issues/2306

3 个答案:

答案 0 :(得分:1)

如果您的应用需求发生变化,那么指定Photos关系所需的确切列可能最终会让您陷入困境。更好的解决方案是仅在特定实例中指定要返回的数据,即您要提供的特定JSON响应。

选项1:扩展/覆盖toArray() Eloquent函数(由toJson()调用)并更改其返回的信息。但是,这会影响对这些方法的每次调用,因此最终会给您带来与在原始查询中执行select()相同的问题。

选项2:为您的JSON响应创建一个特定方法,并将其调用而不是通用toJson()。然后,该方法可以进行任何必要的数据构建/数组修改,以实现所需的特定输出。

选项3:如果您正在使用需要特定格式的API或ajax调用,请考虑使用League/Fractal这样的库,这是专为此类场合而构建的。 (菲尔也正在研究book on building APIs,它并没有吮吸。)

答案 1 :(得分:1)

您可以使用lamavel关系将belongsToMany与select操作一起使用。

public function photos()
{
  return $this->belongsToMany('Photo')->select(array('name', 'date'));
}

答案 2 :(得分:0)

我假设您有一个名为user_id的列。然后你应该能够做到以下几点:

public function photos()
{
    return $this->belongsToMany('Photo')->select(['id', 'user_id', 'date', 'name']);
}

你必须选择外键,否则它将无法加入它。