Laravel Eloquent:如何仅从连接表中获取某些列

ral*_*alu 95 php laravel eloquent

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

主题模型:

public function user() {
  return $this->belongs_to('User');
}
Run Code Online (Sandbox Code Playgroud)

用户模型:

public function themes() {
  return $this->has_many('Theme');
}
Run Code Online (Sandbox Code Playgroud)

我的Eloquent api电话如下:

return Response::eloquent(Theme::with('user')->get());
Run Code Online (Sandbox Code Playgroud)

它返回主题中的所有列(没关系),以及来自用户的所有列(不是很好).我只需要用户模型中的"用户名"列,如何限制查询?

小智 102

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

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

并且不要忘记包括您正在加入的列.

  • 很好的答案,关于加入列的提示也为我节省了大量时间! (6认同)
  • 我认为这不是一个好方法.它将对列名进行硬编码.所有地方只会返回这些列.在其他一些api中,我可能需要更多的列,所以这里不会工作.我认为使用QueryBuilder是这里的选择. (4认同)
  • 这是一种戏剧性的方法,因为它会在每次拨打电话时发生.我相信Sajjad Ashraf的答案是大多数人会感兴趣的. (2认同)

Jav*_*olz 37

对于Laravel> = 5.2

使用- > pluck()方法

$roles = DB::table('roles')->pluck('title');
Run Code Online (Sandbox Code Playgroud)

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


对于Laravel <= 5.1

使用- > lists()方法

$roles = DB::table('roles')->lists('title');
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是问题的答案(具体是关于联接/关系). (2认同)

Mel*_*vin 28

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

return Response::eloquent(Theme::with('user')->get(array('user.username'));
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我试过这个,它显示错误`SQLSTATE [42S22]:Column not found`,它的SQL不包括`with`中的表.它出现在错误上的SQL是"SELECT fk_table.column1 FROM main_table". (2认同)

ayk*_*kut 21

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

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


Saj*_*raf 15

我就是这样做的

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

用户2317976的第一个回答对我不起作用,我正在使用laravel 5.1

  • 最新答案=有用! (2认同)

Jas*_*wis 11

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

public static $hidden = array('password');
Run Code Online (Sandbox Code Playgroud)

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

您也可以以类似的方式动态设置它.

User::$hidden = array('password');
Run Code Online (Sandbox Code Playgroud)

  • 在Laravel 4.2中我试图动态设置时"无法访问受保护的属性User :: $ hidden". (2认同)

Nuf*_*ayl 9

使用分页

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


Kin*_*noP 6

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

这是我发现的一个动态技巧,所以你可以在使用模型时得到你想要的任何东西:

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

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

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});
Run Code Online (Sandbox Code Playgroud)

确保您还包含目标表的密钥,否则将无法找到它.


小智 6

这条路:

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


Arm*_*yan 5

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

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

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