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

时间:2013-02-06 10:42:40

标签: php laravel eloquent

我在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());

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

16 个答案:

答案 0 :(得分:99)

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

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

不要忘记包括您加入的专栏。

答案 1 :(得分:37)

对于Laravel> = 5.2

使用->pluck()方法

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

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


对于Laravel< = 5.1

使用->lists()方法

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

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

答案 2 :(得分:27)

您可以在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();

答案 3 :(得分:21)

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

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

答案 4 :(得分:15)

我就是这样做的

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

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

答案 5 :(得分:11)

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

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

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

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

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

答案 6 :(得分:9)

使用分页

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

答案 7 :(得分: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(..)});

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

答案 8 :(得分:6)

这种方式:

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

答案 9 :(得分:5)

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

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

我建议Fractal作为输出转换层的坚实基础。您可以阅读文档here

答案 10 :(得分:4)

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

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

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

答案 11 :(得分:3)

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

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

您可以添加一个冒号,并选择以逗号分隔的字段,并在它们之间没有空格。

答案 12 :(得分:2)

使用型号:

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

使用查询构建器:

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

答案 13 :(得分:0)

如果我很好理解这个,那么返回的内容很好,除非你只想看到一列。如果是这样,下面的内容应该简单得多:

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

答案 14 :(得分: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);

答案 15 :(得分:-3)

结帐,http://laravel.com/docs/database/eloquent#to-array

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