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中的列。