我在 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());
它返回主题的所有列(很好),以及用户的所有列(不好)。我只需要用户模型中的“用户名”列,如何将查询限制为该列?
Response
我需要导入什么样的类?
更改模型以指定要选择的列:
public function user() {
return $this->belongs_to('User')->select(array('id', 'username'));
}
并且不要忘记包括您要加入的列。
您可以在 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();
SQLSTATE[42S22]: Column not found
,它的 SQL 不包括 with
中的表。它出现在错误上的 sql 是“SELECT fk_table.column1 FROM main_table”。
我知道,您要求 Eloquent,但您可以使用 Fluent Query Builder
$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->get(array('themes.*', 'users.username'));
我就是这样做的
$posts = Post::with(['category' => function($query){
$query->select('id', 'name');
}])->get();
user2317976 的第一个答案对我不起作用,我使用的是 laravel 5.1
pivot
添加到 Post Model protected $hidden = ['pivot']
的 $hidden 数组中
与分页一起使用
$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);
另一种选择是利用模型上的 $hidden
属性来隐藏您不想显示的列。您可以动态定义此属性或在模型上设置默认值。
public static $hidden = array('password');
现在,当您返回 JSON 响应时,用户密码将被隐藏。
您也可以以类似的方式即时设置它。
User::$hidden = array('password');
static
。
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(..)});
确保您还包括目标表的键,否则它将无法找到它。
这边走:
Post::with(array('user'=>function($query){
$query->select('id','username');
}))->get();
在 Laravel 4 中,您可以通过在模型中添加以下内容来隐藏某些字段以防止返回。
protected $hidden = array('password','secret_field');
http://laravel.com/docs/eloquent#converting-to-arrays-or-json
在 Laravel 5.5 上,最简洁的方法是:
Theme::with('user:userid,name,address')->get()
您添加一个冒号和您希望选择的字段,用逗号分隔,并且它们之间没有空格。
使用型号:
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']));
#您可以从两个或三个不同的表中获取选定的列
$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);