Laravel雄辩:如何从连接的表中只获得某些列

我有两个表格,即主题和用户。

主题模式:

public function user() { return $this->belongs_to('User'); } 

用户模式:

 public function themes() { return $this->has_many('Theme'); } 

我雄辩的API调用如下所示:

 return Response::eloquent(Theme::with('user')->get()); 

其中返回从主题(这很好)的所有列,和用户(不好)的所有列。 我只需要用户模型的“用户名”列,我怎样才能限制查询?

更改模型以指定要select的列:

 public function user() { return $this->belongs_to('User')->select(array('id', 'username')); } 

不要忘记包括你join的专栏。

对于Laravel> = 5.2

使用- > pluck()方法

 $roles = DB::table('roles')->pluck('title'); 

如果要检索包含单个列的值的数组,可以使用pluck方法


对于Laravel <= 5.1

使用- > lists()方法

 $roles = DB::table('roles')->lists('title'); 

这个方法将返回一个angular色标题数组。 您也可以为返回的数组指定一个自定义键列:

您可以在get参数中提供一个字段数组,如下所示:

 return Response::eloquent(Theme::with('user')->get(array('user.username')); 

更新(对于Laravel 5.2)从文档 ,你可以这样做:

 $response = DB::table('themes') ->select('themes.*', 'users.username') ->join('users', 'users.id', '=', 'themes.user_id') ->get(); 

我知道,你要求雄辩,但你可以用stream利的查询生成器

 $data = DB::table('themes') ->join('users', 'users.id', '=', 'themes.user_id') ->get(array('themes.*', 'users.username')); 

另一个select是利用模型上的$hidden属性来隐藏你不想显示的列。 您可以即时定义该属性或在模型上设置默认值。

 public static $hidden = array('password'); 

现在,当您返回JSON响应时,用户密码将被隐藏。

您也可以使用类似的方式进行设置。

 User::$hidden = array('password'); 

这是我如何做到这一点

 $posts = Post::with(['category' => function($query){ $query->select('id', 'name'); }])->get(); 

user2317976的第一个答案不适用于我,我正在使用laravel 5.1

与分页一起使用

 $data = DB::table('themes') ->join('users', 'users.id', '=', 'themes.user_id') ->select('themes.*', 'users.username') ->paginate(6); 

user2317976引入了一个很好的select相关表的列的静态方法。

这是我发现的一个dynamic的技巧,所以你可以得到任何你想要的使用模型:

 return Response::eloquent(Theme::with(array('user' => function ($q) { $q->addSelect(array('id','username')) }))->get(); 

我刚刚发现这个技巧也适用于load()。 这很方便。

 $queriedTheme->load(array('user'=>function($q){$q->addSelect(..)}); 

确保你还包括目标表的密钥,否则将无法find它。

这条路:

 Post::with(array('user'=>function($query){ $query->select('id','username'); }))->get(); 

我知道这是一个老问题,但是如果你正在构build一个API,就像问题的作者那样,使用输出转换器来执行这样的任务。

Transofrmer是您的实际数据库查询结果和控制器之间的一个层。 它允许轻松地控制和修改要输出给用户或API消费者的内容。

我build议分形作为输出转换层的坚实基础。 你可以在这里阅读文档。

在Laravel 4中,您可以通过在模型中添加以下内容来隐藏某些字段。

 protected $hidden = array('password','secret_field'); 

http://laravel.com/docs/eloquent#converting-to-arrays-or-json

使用型号:

 Model::where('column','value')->get(['column1','column2','column3',...]); 

使用查询生成器:

 DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]); 

如果我很好的理解这一点,返回的是好的,除了你想看到只有一列。 如果是这样,下面应该简单得多:

 return Response::eloquent(Theme::with('user')->get(['username'])); 

看看http://laravel.com/docs/database/eloquent#to-array

你应该能够定义你不想显示在你的API中的列。