104

我在 Eloquent 中有 2 个连接表,即主题和用户。

主题模型:

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

用户模型:

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

我的 Eloquent api 调用如下所示:

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

它返回主题的所有列(很好),以及用户的所有列(不好)。我只需要用户模型中的“用户名”列,如何将查询限制为该列?

4

16 回答 16

105

更改模型以指定要选择的列:

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

并且不要忘记包括您要加入的列。

于 2013-04-25T02:37:47.050 回答
36

对于 Laravel >= 5.2

使用->pluck()方法

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

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


对于 Laravel <= 5.1

使用->lists()方法

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

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

于 2013-10-13T12:05:42.960 回答
31

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

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

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

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();
于 2013-06-11T05:46:53.180 回答
23

我知道,您要求 Eloquent,但您可以使用Fluent Query Builder

$data = DB::table('themes')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get(array('themes.*', 'users.username'));
于 2013-02-06T12:22:22.377 回答
16

我就是这样做的

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

user2317976 的第一个答案对我不起作用,我使用的是 laravel 5.1

于 2016-02-16T15:46:23.410 回答
11

另一种选择是利用$hidden模型上的属性来隐藏您不想显示的列。您可以动态定义此属性或在模型上设置默认值。

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

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

您也可以以类似的方式即时设置它。

User::$hidden = array('password');
于 2013-04-25T04:28:36.040 回答
11

与分页一起使用

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);
于 2015-06-30T13:06:14.243 回答
6

user2317976 引入了一种很好的静态方法来选择相关表的列。

这是我发现的一个动态技巧,因此您可以在使用该模型时获得所需的任何内容:

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

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

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

确保您还包括目标表的键,否则它将无法找到它。

于 2014-10-22T02:52:47.250 回答
6

这边走:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();
于 2016-03-03T05:46:20.217 回答
5

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

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

我推荐Fractal作为输出转换层的坚实基础。您可以在此处阅读文档。

于 2014-10-03T09:59:42.490 回答
4

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

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

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

于 2013-07-17T16:57:27.547 回答
4

在 Laravel 5.5 上,最简洁的方法是:

Theme::with('user:userid,name,address')->get()

您添加一个冒号和您希望选择的字段,用逗号分隔,并且它们之间没有空格。

于 2018-01-20T15:16:44.070 回答
2

使用型号:

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

使用查询生成器:

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);
于 2017-10-05T09:35:44.683 回答
0

If I good understood this what is returned is fine except you want to see only one column. If so this below should be much simpler:

return Response::eloquent(Theme::with('user')->get(['username']));
于 2016-01-14T10:50:41.300 回答
0

#您可以从两个或三个不同的表中获取选定的列

$users= DB::Table('profiles')->select('users.name','users.status','users.avatar','users.phone','profiles.user_id','profiles.full_name','profiles.email','profiles.experience','profiles.gender','profiles.profession','profiles.dob',)->join('users','profiles.user_id','=','users.id')
            ->paginate(10);
于 2021-08-04T06:29:04.790 回答
-3

签出, http: //laravel.com/docs/database/eloquent#to-array

您应该能够定义不希望在 api 中显示的列。

于 2013-02-06T12:32:12.693 回答