因此,我通过数据透视表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
答案 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']);
}
你必须选择外键,否则它将无法加入它。